假设我们有两个由无符号长(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#)。
答案 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)?