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

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

假设我们有两个由无符号长(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/

相关文章:

c# - 用于显示发件人图片的 Outlook 插件(在 C# 中)

c - 在 openCl 内核中使用 "String"

c - 查找不在一系列单词中的缺失小写字母

c# - 如何在 NEST C# 中编写动态 Elasticsearch 查询

c# - protobuf-net [反] 跨程序集边界序列化

c# - Request.UserHostAddress 和 Request.ServerVariables ["REMOTE_ADDR".ToString() 有什么区别

c++ - cocoa 消息泵?

c++ - Qt中实现精确定时器

c++ - 阻止进程使用 WMI 启动?

c - 为什么c语言中的putchar()中x - x什么都没有?