Java移位操作符分为三种:左移位操作符(<<)、有符号右移位操作符(>>)、无符号右移位操作符(>>>)
1、如果对char、byte、short类型的数值进行移位操作,那么在移位之前,它们会被转换为int类型,并且得到的结果也是一个int类型的值
2、对于int类型数值进行移位操作,移位数的低5位才是有效的,这样可防移位超过int类型所具有的位数(低5位最大值为31,即单次移位操作至多移动31位);如果是long类型数值进行移位,那么移位数的低6位才有用
左移位操作符 <<
package p1;
public class K {
public static void main(String[] args) {
int i1 = 128;
System.out.println("128 二进制码:" + Integer.toBinaryString(i1));
// 2的低5位:00010(2),相当于左移位2
i1 = 128 << 2;
System.out.println("128 << 2 二进制码:" + Integer.toBinaryString(i1));
// 64的低5位:00000(0),相当于左移位0
i1 = 128 << 64;
System.out.println("128 << 64二进制码:" + Integer.toBinaryString(i1));
// 65的低5位:00001(1),相当于左移位1
i1 = 128 << 65;
System.out.println("128 << 65二进制码:" + Integer.toBinaryString(i1));
// -31的低5位:00001(1),相当于左移位1
i1 = 128 << -31;
System.out.println("128 << -31二进制码:" + Integer.toBinaryString(i1));
}
}
128 二进制码: 10000000
128 << 2 二进制码: 1000000000
128 << 64二进制码: 10000000
128 << 65二进制码: 100000000
128 << -31二进制码:100000000
无符号右移位操作符 >>>:无论被移数是正是负,高位补0
有符号右移位操作符 >>:被移数如果是正数,高位补0;如果是负数,高位补1
package p1;
public class K {
public static void main(String[] args) {
int i1 = 128;
System.out.println("128 二进制码:" + Integer.toBinaryString(i1));
// 2的低5位:00010(2),相当于左移位2
i1 = 128 >> 2;
System.out.println("128 >> 2 二进制码:" + Integer.toBinaryString(i1));
i1 = -128;
System.out.println("-128 二进制码:" + Integer.toBinaryString(i1));
// 2的低5位:00010(2),相当于左移位2
i1 = -128 >> 2;
System.out.println("-128 >> 2 二进制码:" + Integer.toBinaryString(i1));
}
}
128 二进制码: 10000000
128 >> 2 二进制码: 100000
-128 二进制码: 11111111111111111111111110000000
-128 >> 2 二进制码:11111111111111111111111111100000