java中的移位运算符: << >> >>>

半兽人 发表于: 2018-08-13   最后更新时间: 2018-08-14 00:39:18  
{{totalSubscript}} 订阅, 3,890 游览

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;

Java中>>和>>>的区别

有符号右移运算符 >>

将一个数的各二进制位全部右移若干位。例如: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;



查看java更多相关的文章或提一个关于java的问题,也可以与我们一起分享文章
提问