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的大小限制,我不想使用它。
谢谢。
试试这个:
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",即最右边的位。然后,b1
和b2
将具有左边的下一个比特、左边的下个比特,依此类推。如果需要,您可以添加更多的行来获得额外的位——只需继续向位偏移参数(1 << #
)添加一个即可。
此外,我也不知道你是否真的关心使用true/false的BitVector——这和存储0/1之间没有功能上的区别。如果真的需要存储0/1,并且不在乎浪费内存,那么可以使用以下语法:
int[] vb0 = a.Select(v => (v & (1 << 0)) != 0 ? 1 : 0).ToArray()
...etc...