关于理解c#数组中的位
本文关键字:数组 于理解 | 更新日期: 2023-09-27 18:04:04
我花了很长时间来理解程序员如何利用c#数组中数据的快速二进制表示的优势,但我就是不明白。
例如,如果我有两个数组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#中切换到二进制世界?对于更准确的问题,如何使用二进制表示和位明智操作以非常有效的方式重写上面的代码?回答与演示代码将不胜感激。
(更新)我正在寻找一个答案,利用存储二进制数据为字节或位,并使用移位位访问/比较数组
使用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
的一个重要注意事项是它比较慢-但是优化(打包的int
或int[]
)是相似的。
您也有语言支持的标志枚举可用-它可能适合您的用例。也许不是。但是他们就在那里。
[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);
}
}