按位移位运算符。签名和未签名

时间:2010-02-11 12:33:56

标签: java bit-shift scjp

我正在使用互联网上的补习说进行SCJP考试。

根据我的说明,>>运算符应该是右移符号,符号位从左边开始。虽然左移位运算符<<应该保留符号位。

然后玩,我可以使用<<运算符(fe Integer.MAX_VALUE << 1评估为-2来移动符号,而我永远无法使用>>移动符号{{1}}运营商。

我一定是在误解某些东西,但是什么?

2 个答案:

答案 0 :(得分:43)

“&GT;&gt;” 中签署是因为它保留了标志。它使用数字的二进制表示中最左边的数字作为填充符。例如:

    | this value is used as a filler 
    11011011 
 >> 11101101  

    01010010
 >> 00101001 

“&GT;&GT;&gt;” 中是此运算符的无符号版本。它总是使用零作为填充物:

    11011011 
>>> 01101101  

    01010010
>>> 00101001

在二进制表示中,最左边的数字确定数字的符号。所以,如果它是'1'那么我们有负值,如果它是'0' - 那么我们的数字是正数。这就是为什么使用最左边的数字作为填充物可以使符号保持永久性。

答案 1 :(得分:2)

这种转变背后的想法是它们可以作为乘法并除以2的幂(&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; 1等于* = 2,&gt;&gt;&gt; 2等于/ = 4),这就是为什么已签名的转移版本存在。但是,无符号转移不一定能够保留负面因素。 &lt;&lt;&lt;正如你的建议,运营商并没有真正保留标志;它恰好发生在你的例子中。尝试在2,147,483,647左转;它不会保持积极的态度。他们之所以不愿意尝试签署“#39;&#39;左移是因为,如果数字从正变为负(或反之),那么你无论如何都超出了变量类型的范围。