Java中的位移

时间:2011-09-22 13:32:09

标签: java bit-manipulation bit

可能我太累了。
为什么以下不显示相同的值?

int x = 42405;
System.out.println(x << 8);  
System.out.println((x &0x00ff) << 8);  

在两种情况下都应该清除低位

2 个答案:

答案 0 :(得分:5)

编辑:好的,我将离开底部为后代......

如果xint,则非常简单:x << 8将与x & 0xff具有相同的值,当且仅当“中间”16位不是设置:

  • x的前8位将与左移
  • 无关
  • x的底部8位由屏蔽保留

如果设置了任何的“中间”16位,那么x & 0xff将与x在仍然由移位保留的位中不同,因此结果会有所不同。

我不明白你为什么期望他们总是给出相同的结果......


我将假设x的类型为byte,并且它实际上是负数。

没有为byte定义的移位操作,所以首先有一个转换为int ...而这取决于你是否有掩码可以改变。

让我们来看看x为-1的情况。然后(int) x -1 - 即位模式全是1。向左移8位,最后得到24 1s的位模式,然后是8 0:

11111111111111111111111100000000 = -256

现在考虑第二行代码 - 即x & 0xff,它只取x的提升值的底部8位 - 即255.你将左移8位而你以16 0s,8 1s,然后8 0s结束:

00000000000000001111111100000000 = 65280

答案 1 :(得分:4)

下面,x是&gt; 0xff,在一种情况下,你掩盖了高3个字节,这意味着你 你做(0x123 & 0x00ff) << 80x23 << 8这与0x123 << 8完全不同

int x = 0x123;
System.out.println(x << 8);  //prints 74496
System.out.println((x &0x00ff) << 8); //prints 8960

如果x是一个字节,它将在移位之前被“提升”为int,如果它是负数,它将符号扩展,并且你在整数中设置了大量的1位,这被掩盖了在一种情况下远离&amp; 0xff,而在另一种情况下不被掩盖

byte x = (byte)0xAA; //x is negative
System.out.println(x << 8);  //prints -22016
System.out.println((x &0x00ff) << 8); //prints 43520