如何合并具有特定移位(偏移)的两个位图

How to merge two bitmaps with specific shift(offset)?

本文关键字:偏移 位图 两个 何合并 合并      更新时间:2023-10-16

假设我们有两个位图,由无符号长(64位)数组表示。我想使用特定的移位(偏移)合并这两个位图。例如,将位图1(较大)合并为位图2(较小)起始偏移量3。 偏移量 3 表示位图1 的第 3 位对应于位图2 的 0 位。通过合并,我的意思是逻辑或操作。最干净的方法是什么?

目前我已经用简单的无效的 for 循环完成了这个

const ulong BitsPerUlong = 64;

    MergeAt(ulong startIndex, Bitmap bitmap2)
    {
            for (int i = startIndex; i < bitmap2.Capacity; i++)
            {
                bool newVal = bitmap2.GetAt(i) | bitmap1.GetAt(i)
                bitmap2.SetAt(i, newVal) 
            }
      }
    bool GetAt(ulong index)
    {
        var dataOffset = BitOffsetToUlongOffset(index);
        ulong mask = 0x1ul << ((int)(index % BitsPerUlong));
        return (_data[dataOffset] & mask) == mask;
    }
    void SetAt(ulong index, bool value)
    {
        var dataOffset = BitOffsetToUlongOffset(index);
        ulong mask = 0x1ul << ((int)(index % BitsPerUlong));
        if (value)
        {
            _data[dataOffset] |= mask;
        }
        else
        {
            _data[dataOffset] &= ~mask;
        }
    }
    ulong BitOffsetToUlongOffset(ulong index)
    {
        var dataOffset = index / BitsPerUlong;
        return dataOffset;
    }

(接受 C/C++/C#)。

正如您可能自己发现的那样,如果offset < BitsPerULong,第一个块可以与:

data1[0] |= data2[0] << offset;

这留下了一些未合并data2[0]位,但您可以通过以下方式获得这些位:

data2[0] >> (BitsPerULong - offset)

因此,i > 0的下一个合并变为:

data1[i] |= (data2[i] << offset) | (data2[i-1] >> (BitsPerULong - offset));

您可以从中构造一个 for 循环来合并所有数据。当然,这仍然意味着 data2 中的几位会"脱落",但我认为这是您的问题描述所固有的?

如果你需要一个更通用的解决方案,其中offset也可以大于 BitsPerULong ,这需要更多的工作。

我想你的意思是你想将较小的"合并"到较大的中。

你试过吗: 位图大 |= ( 位图小 <<3 )