GoodCoder666的个人博客

Java中的整数移位运算符

2020-04-04 · 3 min read
Java 语法

对于<<, >>两种运算符,可以这样说:
a<<b=a2ba<<b=a*2^b
a>>b=a/2ba>>b=a/2^b
但是对于>>>...不好说了。

这些位运算在计算机中怎样运算的?

大家都知道,整数在计算机中是以二进制存储的:
0=(0)20 = (0)_2
4=(100)24 = (100)_2
8=(1000)28 = (1000)_2
20=(10100)220 = (10100)_2
666=(1010011010)2666 = (1010011010)_2

左移(<<

a<<ba << b就是在aa的二进制后面添上bb00,所以a<<b=a2ba<<b=a*2^b

2020当例子,

20<<1=(10100)2<<1=(101000)2=4020 << 1 = (10100)_2 << 1 = (101000)_2 = 40
20<<2=(10100)2<<2=(1010000)2=8020 << 2 = (10100)_2 << 2 = (1010000)_2 = 80

右移(>>

>><<相反,a>>ba>>b就是在aa的二进制后面去掉bb位,所以a>>b=a/2ba>>b=a/2^b

还是拿2020当例子:

20>>1=(10100)2>>1=(1010)2=1020 >> 1 = (10100)_2 >> 1 = (1010)_2 = 10
20>>2=(10100)2>>2=(101)2=520 >> 2 = (10100)_2 >> 2 = (101)_2 = 5

如果末尾不是00呢?照样去:

21>>1=(10101)2>>1=(1010)2=1021 >> 1 = (10101)_2 >> 1 = (1010)_2 = 10

无符号/逻辑右移(>>>

看这里