字节数组到int转换的解决方案差异

时间:2018-02-14 18:34:50

标签: c# arrays byte

我有一个字节数组,它保存4个字节,转换为整数。 我有这两个例子,它们在int.MinValue,0,int.MaxValue和其他值上测试时都产生相同的结果。

byte[] bytes; //holds 4 bytes

//solution a
int a = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24);

//solution b
return bytes[0] + (bytes[1] << 8) + (bytes[2] << 16) + (bytes[3] << 24);

这两个例子有什么区别,它们是否都有效,可能有任何执行速度差异?不幸的是,我无法找到差异的描述。

::请注意,我正在寻找这个特定案例的答案,而不是回答不建议使用BitConverter或其他库。

由于

1 个答案:

答案 0 :(得分:2)

两者都会给出相同的结果,但我总是选择|,因为你处理的是比特而不是数字。

为了理解为什么它们是等价的,你首先必须要理解二进制数和二进制数学:

var b = 0b0011; //binary 0011

好的,让我们做一些与您的代码类似的事情:

var s = b + (b << 2);

一步一步:

0011 < 21100

要评估1100 | 0011,您只需or与其对应的1111。    结果是(0011 < 2) + 1100

现在, 0011 + 1100 ———- 1111 是什么?好吧,做正常的加法,但记住,这是二进制数,所以我们携带两个而不是几十:

0 + 1

你现在看到为什么两者都会给出相同的结果?永远不会有任何结转,因此加法和结果基本相同:0|1$(this)给出相同的结果,但同样,它们是完全不同的操作。