2011-09-22 41 views
-2

可能是我太累了。
为什么不显示相同的值?Java中的位移

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

低位应该清楚在这两种情况下

+3

什么'x'的类型不被屏蔽掉? –

+0

你的输出是什么? –

+0

对我来说工作很好w /几个值;为什么不工作? –

回答

5

编辑:好的,我要离开了后人底部...

如果xint,那么它是非常简单的: x << 8将具有相同的值作为x & 0xff当且仅当没有“中间” 16位设置:

  • 顶部8的位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 
+0

不会0x00ff表明该类型是否短? – pablochan

+0

@pablochan:不一定。基本上它是完全不清楚 - 我们将不得不希望OP实际上提供更多信息... –

+0

对不起,这是'int'.I更新后 – Cratylus

4

下面,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