Java中的左移右移详细分析

Posted Firm陈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的左移右移详细分析相关的知识,希望对你有一定的参考价值。

前提:<<(左移),>>(右移)皆属于位运算符.其运算比乘除快,所以我们可以用其优化代码。尖头代表着方向

1、<<表示左移,不分正负数,低位补0;
规则是带符号位移,高位移出,低位补0,移动位数超过该类型的最大位数,则进行取模,如对Integer型左移34位,实际上只移动了两位。左移一位相当于乘以2的一次方,左移n位相当于乘以2的n次方。

注:以下数据类型默认为byte---8位

左移时不管正负,低位补0

正数:**r = 20 << 2**

  20的二进制补码:0001 0100

  向左移动两位后:0101 0000

         结果:r = 80

负数:**r = -20 << 2**

  -20 的二进制原码 :1001 0100

  -20 的二进制反码 :1110 1011

  -20 的二进制补码 :1110 1100

  左移两位后的补码:1011 0000

        反码:1010 1111

        原码:1101 0000 

        结果:r = -80

2、>>表示右移,如果该数为正,则高位补0,若为负数,则高位补1;

注:以下数据类型默认为byte-8位

正数:r = 20 >> 2

  20的二进制补码:0001 0100

  向右移动两位后:0000 0101

       结果:r = 5

负数:r = -20 >> 2

  -20 的二进制原码 :1001 0100

  -20 的二进制反码 :1110 1011

  -20 的二进制补码 :1110 1100 

  右移两位后的补码:1111 1011 

        反码:1111 1010

        原码:1000 0101

        结果:r = -5

3、>>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0

正数: r = 20 >>> 2

    的结果与 r = 20 >> 2 相同;

负数: r = -20 >>> 2

注:以下数据类型默认为int 32位

  -20:源码:10000000 00000000 00000000 00010100

    反码:11111111  11111111   11111111   11101011

    补码:11111111  11111111   11111111   11101100

    右移:00111111  11111111   11111111   11111011

    结果:r = 1073741819

以上是关于Java中的左移右移详细分析的主要内容,如果未能解决你的问题,请参考以下文章

Java-左移右移-jdk8

左移右移小结(转)

位运算符——左移右移

python怎么集体右移

如何计算位运算中的左移和右移

第十三届蓝桥杯Java B 组国赛 C 题——左移右移(AC)