我试图从整数值初始化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。
任何帮助都将非常感谢!
答案 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();