【问题标题】:Integer array to bitarray in c#C#中的整数数组到位数组
【发布时间】:2013-07-07 19:00:21
【问题描述】:

我有一个大长度的整数数组。例如。 {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只能包含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。

谢谢。

【问题讨论】:

  • 您的问题含糊不清。你想每个整数返回一个 BitArray,还是只返回 3 个 BitArray,每个位位置一个(假设每个整数都是 0..7)?
  • 另外,你有没有分析过你的代码,或者你只是猜测 if/else 块会很慢?
  • @MichaelBray 3 位数组。所以第一个位数组将具有所有整数的最左边位。从上面的例子中,leftMostBitArray 应该有 00101001。MiddleBitArray 应该有 11010100,RightmostBitArray 应该有 01000010。
  • 您可以使用leftMostbitArray[0] = (bit is 0) 代替您的 if/else(当然,正确实现“位为 0”)

标签: c#


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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    相关资源
    最近更新 更多