Java中的 << , >> , 和 >>>所代表的含义

标题 Java中的 << , >> , 和 >>>所代表的含义

1.<<表示左移运算符

例如8<<1,表示将8向左移1位,低位补0,结果为16。
例如8<<2,表示将8向左移2位,低位补0,结果为32。
左移一位相当于乘以二
二进制演算:
8的二进制:1 0 0 0
向左移动两位结果为1 0 0 0 0 0,换算成十进制即为32,左移就是将数变大

2.>>表示右移运算符

例如 8>>1,表示将8向右移动1位,结果为4。高位补0。
例如 8>>2,表示将8向右移动2位,结果为2。高位补0。
右移一位相当于除以二
二进制演算:
8的二进制:1 0 0 0
向右移动两位:0 0 1 0即为2,右移就是将数变小

3.>>>表示无符号右移运算符。高位补0

例如8>>>2表示将8向右移位2位,结果为2。
这个在正数时也可以和右移运算符一起理解。

但是在负数时就不一样了
举个例子:
将15右移无符号右移两位: 15>>>2
15的二进制是:1 1 1 1,右移两位变为 :0 0 1 1 ,转换成二进制为:3
那么-15>>>2 又是多少呢?,先求得-15的二进制,往下看

Demo:求-15>>2 和 -15>>>2

解释:一个是带符号右移两位,一个是无符号右移两位。
区别:看下面的讲解基本就明白了!

一个二进制的正数的原码和反码和补码是相同的,负数就不一样了。

要知道一个完整的二进制是由32位表示的

  • -15的完整二进制为:
    10000000 00000000 00000000 00001111
  • -15的反码为:
    11111111 11111111 11111111 11110000 (反码:将二进制数除符号位外取反,所得的新二进制数为反码)
  • -15的补码为:
    11111111 11111111 11111111 11110001 (补码:反码加1称为补码。也就是说,要得到一个数的补码,先得到反码,然后将反码最右边的位加上1即为补码。)
  1. 求-15>>2
    将-15的补码带符号右移两位
    -15的补码为:
    11111111 11111111 11111111 11110001
    将-15的补码带符号右移两位:
    11111111 11111111 11111111 11111100
    不懂看图解
    图解:
    在这里插入图片描述在这里插入图片描述
    看我圈住的红色部分,将红色部分那块右移两位到最右边(最右边两个被替换覆盖),左边空出的两个高位补1,这就是带符号右移

    求值:
    将补码无符号右移后的结果保留符号位其余的位取反:
    10000000 00000000 00000000 00000011
    然后+1,即为最后的结果:
    10000000 00000000 00000000 00000100
    结果为-4

  2. 求-15>>>2
    将-15的补码无符号右移两位
    -15的补码为:
    11111111 11111111 11111111 11110001
    将-15的补码无符号右移两位:
    00111111 11111111 11111111 11111100

    图解
    在这里插入图片描述
    在这里插入图片描述
    看我圈住的红色部分,将红色部分那块右移两位到最右边(最右边两个被替换覆盖),左边空出的两个高位补0,这就是无符号右移

    求值:
    将-15的补码无符号右移两位后直接求结果:
    00111111 11111111 11111111 11111100
    结果为:1073741820

    验证:
    Java中的 << , >> , 和 >>>所代表的含义_第1张图片
    Java中的 << , >> , 和 >>>所代表的含义_第2张图片

总结:

  1. 正数的左右移管它是有符号还是无符号,直接在原码的基础上移动,并求结果就好了
  2. 负数的左右移区别在有符号左右移和无符号左右移
    有符号的左右移: 第一步 — 求出负数的补码 ,第二步 — 将补码左右移,第三步 — 高位不变其余取反,最后一位再加1
    无符号的左右移: 第一步 — 求出负数的补码 ,第二步 — 将补码左右移,第三步 — 直接求结果

你可能感兴趣的:(计算机基础,java,数据结构)