【问题标题】:Initialize BitArray from integer从整数初始化 BitArray
【发布时间】:2014-08-30 02:52:52
【问题描述】:

我正在尝试从整数值初始化 System.BitArray 实例。但是,我似乎没有得到正确的值。

我的代码是

        var b = new BitArray(BitConverter.GetBytes(0xfa2));
        for (int i = 0; i < b.Count; i++)
        {
            char c = b[i] ? '1' : '0';
            Console.Write(c);
        }
        Console.WriteLine();

我也试过不使用 BitConverter:

        var b = new BitArray(new int[] { 0xfa2 });

但这些尝试似乎都没有奏效。这些是这里建议的尝试:Convert int to a bit array in .NET

我的输出:01000101111100000000000000000000。 预期输出:111110100010。

任何帮助将不胜感激!

【问题讨论】:

  • 看起来差不多,除了一些前导零
  • 这与架构的endienness有关。 stackoverflow.com/questions/217980/… 的可能重复项
  • 您期望 12 位而不是 32 位吗?还是您在谈论位的顺序?

标签: c#


【解决方案1】:

您从错误的方向循环。试试这个:

    var b = new BitArray(BitConverter.GetBytes(0xfa2));
    for (int i = b.Count-1; i >= 0; i--)
    {
        char c = b[i] ? '1' : '0';
        Console.Write(c);
    }
    Console.WriteLine();

【讨论】:

    【解决方案2】:

    这是一个 Little-Endian 与 Big-Endian 的问题,因此您需要考虑硬件架构的字节序。同样基于documentation,您需要更改打印 BitArray 的方式。

    byte[] buffer = BitConverter.GetBytes((ushort)0xfa2);
    
    if (BitConverter.IsLittleEndian) Array.Reverse(buffer);
    
    var b = new BitArray(buffer);
    
    for (int i = 0; i < b.Count; i+=8)
    {
        for (int j=i + 7; j >= i; j--)
        {
            char c = b[j] ? '1' : '0';
            Console.Write(c);
        }
    }
    
    Console.WriteLine();
    

    参考:

    数组中的第一个字节表示位 0 到 7,第二个字节 byte 表示位 8 到 15,依此类推。最不重要的 每个字节的位代表最低的索引值:“bytes [0] & 1” 表示位 0,“字节 [0] & 2”表示位 1,“字节 [0] & 4” 表示位 2,依此类推。

    【讨论】:

    • 感谢详细解答!!
    【解决方案3】:

    如文档BitArray Constructor (Int32[])中所述:

    第一个值数组元素中的数字表示位 0 到 31,数组中的第二个数字表示位 32 到 63,依此类推。每个整数的 Least Significant Bit 表示最低索引值:“values [0] & 1”表示第 0 位,“values [0] & 2”表示第 1 位,“values [0] & 4”表示第 2 位,以及以此类推。

    使用此构造函数时无需检查字节顺序,只需反转输出顺序即可:

    var b = new BitArray(new int[] { 0xfa2 });
    // skip leading zeros, but leave least significant bit:
    int count = b.Count;
    while (count > 1 && !b[count-1])
        count--;
    // output
    for (int i = count - 1; i >= 0; i--)
    {
        char c = b[i] ? '1' : '0';
        Console.Write(c);
    }
    Console.WriteLine();
    

    【讨论】:

      猜你喜欢
      • 2018-10-11
      • 2018-09-03
      • 2011-05-25
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      • 2016-06-30
      • 1970-01-01
      相关资源
      最近更新 更多