2018-04-24 JAVA 移位运算符

移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数。
有三种移位运算符 (<<,>>,>>>)

1,<< 左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(在低位补0) x<<3

2,>> 有符号右移运算符,将运算符左边的对象向右移动运算符右边指定的位数。使用符号扩展机制,也就是说,如果值为正,则在高位补0,如果值为负,则在高位补1. x>>3

3,>>> 无符号右移运算符,将运算符左边的对象向右移动运算符右边指定的位数。采用0扩展机制,也就是说,无论值的正负,都在高位补0. x>>>3

因为计算机中int是以补码存储的,所以实际运行时是以补码形式来进行移位操作的
例如
10 的补码为00000000 00000000 00000000 00001010(正数的反码,补码跟原码相同)

            00000000 00000000 00000000 00001010
 10 << 2    00000000 00000000 00000000 00101000    左侧舍弃2位,右侧补0  结果:40
 10 >> 2    00000000 00000000 00000000 00000010    左侧补2个0(正数),右侧舍弃两位 结果:2
 10 >>>2    00000000 00000000 00000000 00000010    左侧补2个0,右侧舍弃两位  结果:2

-10的补码为11111111 11111111 11111111 11110110

            11111111 11111111 11111111 11110110
-10 << 2    11111111 11111111 11111111 11011000    左侧舍弃2位,右侧补0 结果:-40
-10 >> 2    11111111 11111111 11111111 11111101    左侧补2个1(负数),右侧舍弃两位  结果:-3
-10 >>>2    00111111 11111111 11111111 11111101    左侧补2个0,右侧舍弃两位  结果:1073741821

通过上边的,我们可以发现
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方
10 << n = 10 * 2^n

对于正数右移,则相当于除以2的n次方(取整) 10 >> n = 10/2^n
10 >> 2 相当于 10 / 2^2 = 2
但对于负数的右移,就没有什么算术意义

从计算速度上讲,移位运算要比算术运算快,所以我们可以在条件满足情况下采用移位来代替乘除法

如果位移之后的数字已经越界了,则就失去了代替乘除法的意义了

public class AA {
        public static void main(String args[]) {

        System.out.println("正数10位移");
        System.out.println("10<<2 = " + (10 << 2));
        System.out.println("10>>2 = " + (10 >> 2));
        System.out.println("10>>>2 = " + (10 >>> 2));
        System.out.println("-----------------------");
        System.out.println("负数-10位移");
        System.out.println("-10<<2 = " + (-10 << 2));
        System.out.println("-10>>2 = " + (-10 >> 2));
        System.out.println("-10>>>2 = " + (-10 >>> 2));
        System.out.println("Integer.MAX_VALUE:"+Integer.MAX_VALUE);
        System.out.println("1073741823 << 1 = "+ (1073741823 << 1));//1073741823左移一位相当于乘2 得到结果为2147483646,未越界
        System.out.println("1073741824 << 1 = "+ (1073741824 << 1));//1073741823左移一位相当于乘2 得到结果为2147483648,越界
        
    }
}

计算结果:

正数10位移
10<<2 = 40
10>>2 = 2
10>>>2 = 2
-----------------------
负数-10位移
-10<<2 = -40
-10>>2 = -3
-10>>>2 = 1073741821
Integer.MAX_VALUE:2147483647
1073741823 << 1 = 2147483646
1073741824 << 1 = -2147483648

推荐阅读更多精彩内容