需要帮助了解按位运算符的用法

9 c# bit-manipulation

我继承了一些代码,无法弄清楚它的一部分:

byte[] b = new byte[4] { 3, 2, 5, 7 };
int c = (b[0] & 0x7f) << 24 | b[1] << 16 | b[2] << 8 | b[3];
Run Code Online (Sandbox Code Playgroud)

谁能告诉我这里发生了什么?

Jon*_*eet 20

基本上,它使用big-endian转换将4字节数组的低31位转换为整数.

所以{0,0,0,1}的字节数组将被转换为1; 一个{0,0,1,0}的字节数组将被转换为256等.

它通过按位运算符的混合来实现:

  • 令我困惑的是为什么Stackoverflow不会让我接受一段时间的答案? (3认同)

Nic*_*ndo 5

没有在一分钟内完成数学运算所以...为了好玩:
[额外括号显示操作顺序]

((b[0] & 0x7f) << 24) | (b[1] << 16) | (b[2] << 8) | b[3]

(b[0] & 0x7f) << 24 =  11 0000 0000 0000 0000 0000 0000
b[1] << 16 = . . . . . . . . . . 10 0000 0000 0000 0000
b[2] << 8 = . . . . . . . . . . . . . . . 101 0000 0000
b[3] = .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 0111
Run Code Online (Sandbox Code Playgroud)

现在或者这些在一起,你得到

0011 0000 0010 0000 0101 0000 0111 = 50,464,007
Run Code Online (Sandbox Code Playgroud)