• java的左移运算符和右移运算符


    1. java移位运算小技巧
      左移一位相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
      右移一位相当于除以2的1次方,右移n位就相当于除以2的n次方。
      比如
      10 << 1 = 20
      10 << 3 = 80
      6 >> 1 = 3
      6 >> 2 = 1

    想要深入理解移位运算,就一定要对计算机的原码、反码、补码非常熟练。

    你要知道的3个事(划重点):
    (1)机器都是使用补码,运算也是使用补码运算。
    (2)正数的原码补码反码都一样。
    (2)补码与原码相互转换,其运算过程是相同。

    1. 原码,反码,补码
      java里byte是占1个字节的,1个字节等于8个位。8个位里的第1位是符号位,用来表示是正数还是负数。
      所以byte能表示的最大机器数也就是[0111 1111],也就是255。

    byte a = 5 ;
    [ +5 ] = 原码[ 0000 0101 ] = 反码[ 0000 0101 ] = 补码[ 0000 0101 ]
    [ -5 ] = 原码[ 1000 0101 ] = 反码[ 1111 1010 ] = 补码[ 1111 1011 ]

    1. 怎么进行移位运算
      移位运算符分左移位(<<)、右移(>>)、无符号右移(<<<)
      其中无符号右移这里就不讨论了,java里没用到。

    (1)左移
    运算方式:数值的补码全部往左移动X位,符号位和最高位都舍弃,最低位补0。
    正数:
    int a = 5 ;
    int b = a << 2 ;
    [ 0000 0000 0000 0000 0000 0000 0000 0101 ] 5的补码
    [ 0000 0000 0000 0000 0000 0000 0001 0100 ] 对于正数而言,反码就是原码,即 20

    负数:
    int a = -5 ;
    int b = a << 2 ;
    [ 1000 0000 0000 0000 0000 0000 0000 0101 ] -5的原码
    [ 1111 1111 1111 1111 1111 1111 1111 1010 ] -5的反码
    [ 1111 1111 1111 1111 1111 1111 1111 1011 ] -5的补码
    [ 1111 1111 1111 1111 1111 1111 1110 1100 ] a<<2左移2位
    将补码转换成原码就可以得到数值,补码转原码和原码转补码一样,上面说过了。
    [ 1000 0000 0000 0000 0000 0000 0001 0011 ]
    [ 1000 0000 0000 0000 0000 0000 0001 0100 ] 得到a<<2的原码,即 -20
    左移n位就相当于乘以2的n次方

    (2)右移
    运算方式:数值的补码向右移X位,符号位不变(左边补上符号位)
    正数:
    int a = 8 ;
    int b = a >> 1;
    [ 0000 0000 0000 0000 0000 0000 0000 1000 ] 8的反码
    [ 0000 0000 0000 0000 0000 0000 0000 0100 ] a>>1向右移1位
    正数的反码就是原码,上面提过了两次,所以a>>1= 4

    负数:
    int a = -8 ;
    int b = a >> 1 ;
    [ 1000 0000 0000 0000 0000 0000 0000 1000 ] -8的原码
    [ 1111 1111 1111 1111 1111 1111 1111 0111 ] -8的反码
    [ 1111 1111 1111 1111 1111 1111 1111 1000 ] -8的补码
    [ 1111 1111 1111 1111 1111 1111 1111 1100 ]  a>>1向右移1位
    补码转原码
    [ 1000 0000 0000 0000 0000 0000 0000 0011 ]
    [ 1000 0000 0000 0000 0000 0000 0000 0100 ]  得到a>>1的原码,即 -4
    右移n位相当于除以2的n次方

    4.Java里为什么要使用移位运算符
    用移位操作可以极大地提高性能,因为在计算机底层对位的操作是最快的,没有之一!移位操作虽然快,但是可能会使代码不太好理解,因此最好加上相应的注释。


     

  • 相关阅读:
    单链表的方向翻转,为什么程序逻辑是这样的?
    TopSAP天融信 LINUX客户端 CentOS版安装
    仿大众点评——秒杀系统部分02
    phantomjs-prebuilt: Running install script, failed in 32s
    【19】c++设计模式——>桥接模式
    GenICam标准(三)
    JWT(JSON Web Token)原理、使用方法及使用注意事项
    豪华卧室怎么装?快来看看吧
    C++的哈希 && 哈希表 && 哈希桶
    mysql创建用户并赋权(亲测)
  • 原文地址:https://blog.csdn.net/yzwfeng/article/details/125514246