参见英文答案 >
Why does Java mask shift operands with 0x1F?2个
移位运算符如何<<当移位位的值大于数据类型的总位数时工作? 例如,
移位运算符如何<<当移位位的值大于数据类型的总位数时工作? 例如,
int i = 2; int j = i<<34; System.out.println(j);
整数的大小是32位,但是我们正在移位34位.这是如何运作的?
解决方法
使用<<转换整数时或>>运算符和换档距离大于或等于32,你采取换档距离mod 32(换句话说,你屏蔽除了移位距离的低5位以外的所有距离).
这可能非常违反直觉.例如(i>>> 32)== i,对于每个整数i.您可能希望它将整个数字向右移动,正输入返回0,负输入返回-1,但不是;它只是返回i,因为
(i<(<(32& 0x1f))==(i << 0)== i. 回到原来的问题,(i<< 33)==(i<<(&(&(0x& 0x1f))
==(i << 1).如果你愿意,你可以用二进制做整件事.二进制270是:0000 0000 0000 0000 0000 0001 0000 1110向右移动1,
你得到:0000 0000 0000 0000 0000 0000 1000 0111这是135.
但是,在你的头脑中解决这个问题的更好方法是完全免除二进制文件.
i>>的值s是floor(i / 2< sup> s< / sup>)(其中s已被屏蔽掉,因此它小于32).那么,270<< 1 =楼层(270/2)= 135. http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.19