位运算(1) -- 移位

2019-09-25  本文已影响0人  sunyelw

位运算是二进制数的各种操作的统称, 本篇是移位操作.


下面我们直接上例子分别说说移位操作需要注意的点.

为了书写方便, 我们使用byte 来做演示. 实际运算会将byte类型转换为int类型计算

补位约定

正常情况

移位操作分三种

正数移位

正数左右移位都比较简单, 这里就各给一个例子, 大家看看就好

(1) 3 >> 1

0000 0011  原码/补码/反码

0000 0001  右移一位

移位后的结果也是正数, 那么其原码就是其自身

3 >> 1 = 2

(2) 1 << 7
转换为int计算

0000 ... 0000 0000 0001 原码/补码/反码 (中间省略16个0)
0000 ... 0000 1000 0000 左移七位

答案就是 128
让我们换一种写法:

(byte) (1 << 7)

前面过程与上面一致,到输出时有所不同:
转换为byte输出, 截取低八位得到

1000 0000

这是个负数呀, 继续转

1111 1111 取反
1000 0000 加一

这是多少? -0 ? 不是, 是 -128 (byte范围的最小负数)

1 >> 9 是多少呢?

负数右移

-3 >> 1

原码         1000 0011

反码         1111 1100  (取反时符号位不动)

补码         1111 1101

右移一位     1111 1110  (这里得到的是补码)

根据补码取其原码,

取反 1000 0001
加一 1000 0010

所以

-3 >> 1 = -2

你猜猜 -3 >> 33 是多少? (那个圈~~)

因为 33 % 32 = 1, 所以

-3 >> 33 = -3 >> 1 = -2

无符号右移

就是连带符号位一起移动~

-1 >>> 1

1000 ... 0001 原码
1111 ... 1110  反码
1111 ... 1111 补码
0111 ... 1111 无符号右移一位

结果就是 2147483647
相信你应该看出来了, 正数的右移与无符号右移是一样一样的, 都是高位补0.


其实移位操作只要细心点加多动手画画基本不会错.

上一篇 下一篇

猜你喜欢

热点阅读