跳到主要内容

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,左移就是将数变大。

例如 8 << 1, 表示将 8 向左移 1 位,低位补 0,结果为 16。 例如 8 << 2 ,表示将 8 向左移 2 位,低位补 0,结果为 32。

左移一位相当于乘以二

快速的算法 M << n 其实可以这么算 M << n = M * 2^n

二进制演算:

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。

右移一位相当于除以二

快速的算法 M >> n 其实可以这么算 M >> n = M / 2^n 二进制演算:

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

背景知识: 正数的原码,反码,补码都是补 0,负数原码补 0,反码补 1,补码左移添 0,右移添 1。(计算机组成原理中的知识)

解释:一个是带符号右移两位,一个是无符号右移两位。

区别:看下面的讲解基本就明白了!

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

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

-15 的完整二进制为:

10000000 00000000 00000000 00001111

-15 的反码为:

11111111 11111111 11111111 11110000 (反码:将二进制数除符号位外取反,所得的新二进制数为反码)

-15 的补码为:

11111111 11111111 11111111 11110001 (补码:反码加1称为补码。也就是说,要得到一个数的补码,先得到反码,然后将反码最右边的位加上1即为补码。)

-15 >> 2

将 -15 的补码带符号右移两位

-15 的补码为:

11111111 11111111 11111111 11110001

将 -15 的补码带符号右移两位:

11111111 11111111 11111111 11111100

求值:

将补码无符号右移后的结果保留符号位其余的位取反:

10000000 00000000 00000000 00000011

然后 +1,即为最后的结果:

10000000 00000000 00000000 00000100

结果为 -4

求值:

将 -15 的补码无符号右移两位后直接求结果:

00111111 11111111 11111111 11111100

结果为:1073741820

总结

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

转载请注明出处,谢谢合作!转载本文请声明原文章链接如下:

原文链接: https://zhoujun134.github.io/docs/java/07-2024-07-25-22-10-23-06-zuo-you-yi

作者: Z 不殊

Z 不殊 致力于分享有价值的信息和知识。我们尊重并保护知识产权。本文仅代表作者观点,不代表任何立场。 如果本文有所侵权,请联系作者删除或修改!

Loading Comments...