如何合并具有特定移位(偏移)的两个位图?
Posted
技术标签:
【中文标题】如何合并具有特定移位(偏移)的两个位图?【英文标题】:How to merge two bitmaps with specific shift(offset)? 【发布时间】:2016-07-08 14:16:57 【问题描述】:假设我们有两个由无符号长(64 位)数组表示的位图。我想使用特定的移位(偏移)合并这两个位图。 例如将 bitmap1(较大)合并到 bitmap2(较小)起始偏移量 3。偏移量 3 表示 bitmap1 的第 3 位对应于 bitmap2 的 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#)。
【问题讨论】:
你能展示你所做的尝试吗?一些伪代码或实现。我认为两个数组的简单循环就足够了 @SimonHoubracken 完成 【参考方案1】:你可能自己想通了,如果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
,这需要更多的工作。
【讨论】:
【参考方案2】:我认为您的意思是要将较小的“合并”成较大的。
您是否尝试过:bitmapLarger |= (bitmapSmaller ?
【讨论】:
数组不支持位移操作...不是吗?以上是关于如何合并具有特定移位(偏移)的两个位图?的主要内容,如果未能解决你的问题,请参考以下文章
STM32F429的DSP教程第12章 DSP基础函数-相反数,偏移,移位,减法和比例因子