c#中的整数数组到位数组

本文关键字:数组 整数 | 更新日期: 2023-09-27 18:21:28

我有一个巨大长度的整数数组。例如{2,3,4,2,4,1,4,…}。我想把它转换成C#中的BitArrays数组。也就是说,010011100010100010001100

因此,可以将其更改为3个位阵列(最左边的位阵列、中间位的位阵列和最右边的位阵列)

这里的问题是,与java中可以直接存储0/1的位集不同,位数组只能包含true/false。由于这个数组非常长,我不想使用if/else,即

for(int i=0; i<N; i++)
   if (bit is 0) then  // time consuming step
       leftMostbitArray[0] = false;
   else
       leftMostbitArray[0] = true;

有什么变通办法可以让我摆脱这一步吗?或者可能是不同的数据结构。由于BitVector32的大小限制,我不想使用它。

谢谢。

c#中的整数数组到位数组

试试这个:

int[] a = new int[] { 2, 3, 4, 2, 4, 2, 1, 4 };
BitArray b0 = new BitArray(a.Select(v => (v & (1 << 0)) != 0).ToArray());
BitArray b1 = new BitArray(a.Select(v => (v & (1 << 1)) != 0).ToArray());
BitArray b2 = new BitArray(a.Select(v => (v & (1 << 2)) != 0).ToArray());

b0将具有"位位置0",即最右边的位。然后,b1b2将具有左边的下一个比特、左边的下个比特,依此类推。如果需要,您可以添加更多的行来获得额外的位——只需继续向位偏移参数(1 << #)添加一个即可。

此外,我也不知道你是否真的关心使用true/false的BitVector——这和存储0/1之间没有功能上的区别。如果真的需要存储0/1,并且不在乎浪费内存,那么可以使用以下语法:

int[] vb0 = a.Select(v => (v & (1 << 0)) != 0 ? 1 : 0).ToArray()
...etc...