Java中的Shift运算符

参见英文答案 > 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

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...