0

我有一个大长度的整数数组。例如 {2, 3, 4, 2, 4, 2, 1, 4, ....}。我想将其转换为 C# 中的 BitArrays 数组。即 010 011 100 010 100 010 001 100

所以这可以变成3个BitArrays(最左边的bitarray,中间位的bitarray,最右边的bitarray)

这里的问题是,与 java 中可以直接存储 0/1 的 bitset 不同,bitarrays 只能包含真/假。而且由于这个数组非常长,我不想使用 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。

谢谢。

4

1 回答 1

1

尝试这个:

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”或最右边的位。然后,b1andb2将在左边有下一位,在左边有下一位,依此类推。如果需要,您可以添加更多行以获取更多位 - 只需继续在位移参数 ( 1 << #) 中添加 1。

此外,我无法判断您是否真的关心使用真/假的 BitVector - 这与存储 0/1 之间没有功能差异。如果您确实需要存储 0/1 并且您不关心浪费内存,那么您可以使用以下语法:

int[] vb0 = a.Select(v => (v & (1 << 0)) != 0 ? 1 : 0).ToArray()
...etc... 
于 2013-07-07T19:08:26.120 回答