java中有三种移位运算符
<< : 左移运算符,num << 1, 结果相当于num乘以2
>> : 右移运算符,num >> 1, 结果相当于num除以2
>>>: 无符号右移,忽略符号位,空位都以0补齐
代码:
/**
* 移位运算符测试
*/
public class TestDemo01 {
public static void main(String[] args) {
int number = 10;
//原始数二进制
printInfo(number);
//左移一位
printInfo(number << 1);
//右移一位
printInfo(number >> 1);
System.out.println(10 >>> 1);
}
/**
* 输出一个int的二进制数
*
* @param num
*/
private static void printInfo(int num) {
System.out.println(num + "," + Integer.toBinaryString(num));
}
}
运行结果:
10,1010
20,10100
5,101
我们把上面的结果对齐一下:
43210 位数
--------
1010 十进制:10 原始数 number
10100 十进制:20 左移一位 number << 1;
101 十进制:5 右移一位 number >> 1;
将一个数的各二进制位全部右移若干位。例如:a = a >> 2
,使a的各二进制位右移两位,移到右端的低位被舍弃
,最高位则移入原来高位的值,如:
a = 00110111
,则a>>2 = 00001101
b = 11010011
,则b>>2 = 11110100
右移一位相当于除2取商,而且用右移实现除法比除法运算速度要快。
来将一个数的各二进制位无符号右移若干位,与运算符>>相同,移出的低位被舍弃,但不同的是最高位补0,如:a = 00110111
,则a>>>2 = 00001101
b = 11010011
,则b>>>2 = 00110100
对于正数而言,>>
和>>>没区别
。
对于负数而言,由于无符号忽略了最高位的正负符号位,所以-2 >>> 1
,结果是 2147483647(Integer.MAX_VALUE)
,-1 >>> 1
,结果是2147483647(Integer.MAX_VALUE)
。
所以,要判断两个数符号是否相同时,可以这么用:
return ((a >> 31) ^ (b >> 31)) == 0;