从整数初始化BitArray

时间:2014-08-29 17:52:55

标签: c#

我试图从整数值初始化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。

任何帮助都将非常感谢!

3 个答案:

答案 0 :(得分:4)

你正在从错误的方向循环。试试这个:

    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();

答案 1 :(得分:2)

这是Little-Endian vs Big-Endian问题,所以你需要考虑hw架构的内在性。同样基于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]&amp; 1”   表示位0,“bytes [0]&amp; 2”表示位1,“bytes [0]&amp; 4”   代表第2位,依此类推。

答案 2 :(得分:1)

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

  

第一个值数组元素中的数字表示位0到31,数组中的第二个数字表示第32到63位,依此类推。每个整数的最低有效位代表最低的索引值:&#34;值[0]&amp; 1&#34;表示位0,&#34;值[0]&amp; 2&#34;代表第1位,&#34;值[0]&amp; 4&#34;代表第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();