可能我太累了。
为什么以下不显示相同的值?
int x = 42405;
System.out.println(x << 8);
System.out.println((x &0x00ff) << 8);
在两种情况下都应该清除低位
答案 0 :(得分:5)
编辑:好的,我将离开底部为后代......
如果x
为int
,则非常简单: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) << 8
,0x23 << 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