作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我们有两个由无符号长(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
第一个 block 可以与以下内容合并:
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
,这需要更多的工作。
关于c# - 如何合并具有特定移位(偏移)的两个位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38268908/
我是一名优秀的程序员,十分优秀!