可能是我太累了。
为什么不显示相同的值?Java中的位移
int x = 42405;
System.out.println(x << 8);
System.out.println((x &0x00ff) << 8);
低位应该清楚在这两种情况下
可能是我太累了。
为什么不显示相同的值?Java中的位移
int x = 42405;
System.out.println(x << 8);
System.out.println((x &0x00ff) << 8);
低位应该清楚在这两种情况下
编辑:好的,我要离开了后人底部...
如果x
是int
,那么它是非常简单的: x << 8
将具有相同的值作为x & 0xff
当且仅当没有“中间” 16位设置:
x
将由左移x
的低8位被掩模保存如果有设置“中间”的16位中的任呈现无关的,然后x & 0xff
将从x
不同在一点仍然保留的转变,因此结果会有所不同。
我不明白你为什么希望他们总是给出相同的结果...
我要去假设的x
类型为byte
,而且它的实际负。
没有为byte
定义移位操作,所以首先有一个转换到int
...这是什么可以改变取决于你是否有面具。
那么我们来看看x
是-1的情况。然后(int) x
是也 -1 - 即位模式全部是1。移位留下了8位和你结束了,然后8 0 24米的1的位模式:
11111111111111111111111100000000 = -256
现在考虑的第二行代码 - 这是服用x & 0xff
,这只会采取的低8位
00000000000000001111111100000000 = 65280
下面,X为> 0xFF的,并且在一种情况下你:即255按住Shift留下了8位和你结束了16 0 8分1秒,然后8 0 - 的x
推广价值掩盖掉上面的3个字节,这意味着你 你做(0x123 & 0x00ff) << 8
,这将是0x23 << 8
这和0很不一样
int x = 0x123;
System.out.println(x << 8); //prints 74496
System.out.println((x &0x00ff) << 8); //prints 8960
如果x是一个字节,它会被“提升”的转变之前,INT,如果它是消极的,它会签署延长,你会得到一大堆的1位的设置整数,这是在一种情况下被屏蔽掉与&为0xFF,而在其他
即
byte x = (byte)0xAA; //x is negative
System.out.println(x << 8); //prints -22016
System.out.println((x &0x00ff) << 8); //prints 43520
什么'x'的类型不被屏蔽掉? –
你的输出是什么? –
对我来说工作很好w /几个值;为什么不工作? –