我有一个字节数组,它保存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或其他库。
由于
答案 0 :(得分:2)
两者都会给出相同的结果,但我总是选择|
,因为你处理的是比特而不是数字。
为了理解为什么它们是等价的,你首先必须要理解二进制数和二进制数学:
var b = 0b0011; //binary 0011
好的,让我们做一些与您的代码类似的事情:
var s = b + (b << 2);
一步一步:
0011 < 2
是1100
要评估1100 | 0011
,您只需or
与其对应的1111
。
结果是(0011 < 2) + 1100
现在, 0011 +
1100
———-
1111
是什么?好吧,做正常的加法,但记住,这是二进制数,所以我们携带两个而不是几十:
0 + 1
你现在看到为什么两者都会给出相同的结果?永远不会有任何结转,因此加法和结果基本相同:0|1
和$(this)
给出相同的结果,但同样,它们是完全不同的操作。