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

9

我继承了一些代码,但无法理解其中的一部分:

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

有人能告诉我这里发生了什么吗?

你能给我们一些关于这段代码来源的背景吗?还是这只是一个测试? - Nix
@Nix 是他得到它的地方真的相关吗? - MGZero
@MGZero 现在问题已经得到回答,不需要了。 - Nix
2个回答

20

基本上它通过使用大端转换将一个由4个字节组成的数组的低31位转换为一个整数。

因此,字节数组 { 0, 0, 0, 1 } 将被转换为1;字节数组 { 0, 0, 1, 0 } 将被转换为256等。

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


有关此事的详细信息?链接等。我会非常感激。 - Kizz
@Kizz:我刚刚在为每个运算符添加链接。你还需要什么? - Jon Skeet
3
为什么 Stackoverflow 不让我在一定时间内接受答案,这让我感到困惑? - user766279
1
@MTG:这样可以给别人一个机会发布更好的。 - Jon Skeet

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

现在将它们组合起来,你就得到了。
0011 0000 0010 0000 0101 0000 0111 = 50,464,007

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接