【问题标题】:On understanding bitwise in c# Arrays在 c# 数组中按位理解
【发布时间】:2015-07-23 11:59:44
【问题描述】:

我花了很长时间了解程序员如何利用 C# 数组中数据的快速二进制表示的优势,但我就是不明白。

例如,如果我有 2 个数组 A 和 B 来存储 0/1 数据。在正常情况下,我们会这样做:

    bool flag=true;
    int[] A = new int[10] { 1, 0, 0, 0, 1, 1, 0, 1, 0, 0 };
    int[] B = new int[10] { 1, 1, 1, 0, 0, 1, 0, 1, 0, 0 };
    // For comparing the first 5 bits :
    for(int i=0;i<5;i++)
        if (A[i] != B[i])
        {
            flag = false;
            break;
        } 
    // Accessing the i*th* positions is :
    A[7]=1;
   int x=B[5];

如果我需要重复此代码数千次怎么办?甚至数组非常大?直接的答案是将数据表示为位压缩数组并应用位运算或位掩码等内容。

我的问题是如何在 c# 中切换到二进制世界?对于更准确的问题,如何使用二进制表示和按位操作以非常有效的方式重写上面的代码?非常感谢您提供演示代码的答案。

[更新] 我正在寻找一个答案,它利用将二进制数据存储为字节或位并使用移位位来访问/比较数组

【问题讨论】:

标签: c# arrays optimization bit-manipulation bit-shift


【解决方案1】:

嗯,直接翻译使用BitVector32 -

var flag = true;
var A = new BitVector32(0x234);
var B = new BitVector32(0x394);

for (var i = 0; i < 5; i++)
{
    if (A[i] != B[i])
    {
        flag = false;
        break;
    }
}

A[7] = true;
bool x = B[5];

如果您需要数组的可变大小,您也可以使用BitArrayBitArray 的一个重要注意事项是它速度较慢 - 但优化(打包的 intint[])是相似的。


您还可以使用语言支持的标志枚举 - 它可能适合您的用例。或者可能不是。但他们在那里。

[Flags]
enum MyFlags
{
    Foo = 0x0001,
    Bar = 0x0002, 
    Baz = 0x0004, 
    All = Foo | Bar | Baz
}

class Program
{
    static void Main(string[] args)
    {
        MyFlags flags = MyFlags.Foo | MyFlags.Baz;
        MyFlags isBar = MyFlags.Bar & flags;

        Console.WriteLine(isBar);
    }
}

【讨论】:

  • 如果我的数组必须容纳 5K 元素怎么办?
  • 我的朋友,你误解了我的问题,我不是想将整数转换为位序列。我已经有一个位序列,我想对它们应用处理,例如比较查找 A 是否是 B 的子集,或者 A 在所有元素上是否与 B 一致,直到第 i 个位置 ...等
  • 感谢您的回答,但不是我想要的
  • BitArray 在保存大数据时很慢
猜你喜欢
  • 1970-01-01
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
相关资源
最近更新 更多