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

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 &lt; BitsPerULong 第一个块可以合并:

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

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

data2[0] >> (BitsPerULong - offset)

所以i &gt; 0 的下一个合并变为:

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

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

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

【讨论】:

【参考方案2】:

我认为您的意思是要将较小的“合并”成较大的。

您是否尝试过:bitmapLarger |= (bitmapSmaller ?

【讨论】:

数组不支持位移操作...不是吗?

以上是关于如何合并具有特定移位(偏移)的两个位图?的主要内容,如果未能解决你的问题,请参考以下文章

移位溢注:告别靠人品的偏移注入 (推荐)

8086指令系统 逻辑运算和移位运算指令

STM32F429的DSP教程第12章 DSP基础函数-相反数,偏移,移位,减法和比例因子

iOS8 UITableView 和 Cell - 自动布局高度 - 触摸和执行 segue 时的移位/垂直偏移错误

SQL注入 移位溢入

如何在 Swift 中使用具有隐式/强制展开的移位运算符