关于理解 C# 数组中的按位

On understanding bitwise in c# Arrays

我花了很长时间了解程序员如何利用 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# 中切换到二进制世界?对于更准确的问题,如何使用二进制表示和按位运算以非常有效的方式重写上面的代码?用演示代码回答将不胜感激。

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

嗯,直接翻译用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];

如果您需要可变大小的数组,您也可以使用 BitArray。关于 BitArray 的一个重要说明是它速度较慢 - 但优化(打包 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);
    }
}