【问题标题】:C# - Converting from bits to Int32 generates wrong valueC# - 从位转换为 Int32 生成错误值
【发布时间】:2014-12-20 14:09:51
【问题描述】:

我正在尝试将 int 值的数组(每个值代表一个位)转换为 Int32 对象的表示形式。

我有以下代码:

//0000_0000_0000_0000_0000_0000_0000_1111 = 15
int[] numberData = new int[]
{
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 1, 1, 1, 1
};

//We convert our int[] to a bool[]
bool[] numberBits = numberData.Select(s => { return s == 0 ? false : true; }).ToArray();

//We generate a bit array from our bool[]
BitArray bits = new BitArray(numberBits);

//We copy all our bits to a byte[]
byte[] numberBytes = new byte[sizeof(int)];
bits.CopyTo(numberBytes, 0);

//We convert our byte[] to an int
int number = BitConverter.ToInt32(numberBytes, 0);

但是,执行这段代码后,number 的值是-268435456

为什么会这样?

【问题讨论】:

  • 我认为没有溢出。 BitArray 共有 32 位,被复制到大小为 4 的 byte[]
  • 注意:这是从位创建整数的一种非常冗长的方法。存在更好的方法(也不会受到“字节顺序”问题的影响)

标签: c# c#-4.0 binary integer type-conversion


【解决方案1】:

位顺序不正确。 -268435456 作为 32 位整数是 11110000 00000000 00000000 00000000,正如您所见,它与您想要的完全相反。

只需反转您的 numberBits 数组,然后再将其转换为 Int32

或者,您可以让numberData 具有正确的顺序,然后再不进行任何反转。

您的代码完全按照您编写的方式运行。在numberData[0]0numberData[1]0,...,numberData[31]1。这将导致结果的第 0 位为0,第 1 位为0,...,第 31 位为1

【讨论】:

  • 我已经反转了numberData,现在number 正在返回251658240 :(
  • @MatiCicero 我刚刚尝试了您的代码,反转位 (1,1,1,1,0,0,....,0,0),答案是15...
  • 我的错,它实际上返回 15。这个解决方案是正确的
  • 已确认。我做了一个Array.Reverse(numberData);,结果确实是 15。
猜你喜欢
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多