美文网首页
2018-04-24 JAVA 移位运算符

2018-04-24 JAVA 移位运算符

作者: MiaLing007 | 来源:发表于2018-04-24 17:54 被阅读0次

    移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理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
    

    相关文章

      网友评论

          本文标题:2018-04-24 JAVA 移位运算符

          本文链接:https://www.haomeiwen.com/subject/hfwjlftx.html