public class Main {
public static void main(String[] args) {
int i = 100;
System.out.println(Integer.toBinaryString(i));
System.out.println(Integer.toBinaryString(-i));
System.out.println(Integer.toBinaryString(i << 4));
System.out.println(Integer.toBinaryString(-i << 4));
System.out.println(Integer.toBinaryString(i >> 4));
System.out.println(Integer.toBinaryString(-i >> 4));
System.out.println(Integer.toBinaryString(i >>> 4));
System.out.println(Integer.toBinaryString(-i >>> 4));
}
}
result:
1100100
11111111111111111111111110011100
11001000000
11111111111111111111100111000000
110
11111111111111111111111111111001
110
1111111111111111111111111001
- think in java 中提到 只有数值右端的低5位才有用,这样可防止我们移位超过int型值所具有的位数
- 因为int型占4字节,共32位,也就是说,一个操作数最多移动32位就毫无意义了,所以移位运算符右端的数字最大不能超过32位,即最大11111,一个数的低五位即可表示。
- 如果运算符右端的数字大于等于32,则可通过取32的模来得到真正需要移动的位数,eg. 1>>34,右边的34>32,因此需要让34对32取余,结果为34%32=2,因此真正的移位运算应该是1>>2
- 同理long型占8字节,共64位,运算符右端数值的低6位对应的十进制才是有效移动位数。
原文:https://www.cnblogs.com/skye-you/p/9588747.html