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

时间:2016-07-08 14:16:58

标签: c# c++ c bitmap bit-manipulation

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

目前我已经用简单的无效循环

完成了这项工作
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#)。

2 个答案:

答案 0 :(得分:0)

正如您可能想到的那样,如果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,则需要更多工作。

答案 1 :(得分:-1)

我认为你的意思是你想要&#34;合并&#34;较小的INTO越大。

您是否尝试过: bitmapLarger | =(bitmapSmaller&lt;&lt; 3)

相关问题