Java:位移运算符

Java中有三个位移运算符,用于对int类型整数的二进制补码进行操作:

1. "<<": 左移运算符

在二进制补码末尾添加“0”,之前的其他位相当于左移了一位,可看作成“乘以二”操作。

   例如,a = 10,a 的二进制表示为“0000 0000 0000 0000 0000 0000 0000 1010”,“a << 1”表示a的二进制表示左移一位,结果为“0000 0000 0000 0000 0000 0000 0001 0100”,对应十进制的“20”。

            b =-10, b 的二进制表示为“1111 1111 1111 1111 1111 1111 1111 0110”,“b<<1”代表b的二进制表示左移一位,结果为“1111 1111 1111 1111 1111 1111 1110 1100”,对应十进制“-20”。

2. ">>": 右移运算符

去掉二进制补码末尾几位,并在最前面添加符号位正数添“0”、负数添“1”。">>1"去掉最后一位,">>2"去掉最后两位。不能单纯的看作成“除以二”操作。

   例如,a = 9, “a>>1"代表a的二进制补码“0000 0000 0000 0000 0000 0000 0000 1001”右移一位,结果为“0000 0000 0000 0000 0000 0000 0000 0100”,对应十进制的“4(不是“除以二”操作)

            b = -9,“b>>1”代表b的二进制补码“1111 1111 1111 1111 1111 1111 1111 0111”右移一位,结果为“1111 1111 1111 1111 1111 1111 1111 1011”,对应十进制的“-5”。

3. ">>>": 无符号右移运算符

不再考虑符号位,在最前面添加“0”(正数前面的“0”符号位可以省略)

   例如,b = -9,“b >>> 1”代表b的二进制补码“1111 1111 1111 1111 1111 1111 1111 0111”右移一位,结果为“0111 1111 1111 1111 1111 1111 1111 1011”,对应十进制的“2147483643”。

public class Test {
    public static void main(String[] args) {
        int a = -9;
        System.out.println("a = " + a);
        System.out.println("a的二进制表示:       " + Integer.toBinaryString(a));
        System.out.println("");
        // "<<"左移运算符
        int a1 = a << 1;
        System.out.println("a<<1 = " + a1);
        System.out.println("a<<1后的二进制表示:  " + Integer.toBinaryString(a1));
        System.out.println("");
        // ">>"右移运算符
        int a2 = a >> 1;
        System.out.println("a>>1 = " + a2);
        System.out.println("a>>1后的二进制表示:  " + Integer.toBinaryString(a2));
        System.out.println("");
        // 无符号右移运算符
        int a3 = a >>> 1;
        System.out.println("a >>> 1 =" + a3);
        System.out.println("a>>>1后的二进制表示: " + Integer.toBinaryString(a >>> 1));

    }
}

  

运行结果:

2018-01-02 18:51:21

原文地址:https://www.cnblogs.com/huiAlex/p/8178590.html