介绍
在位移方向上,有左移和右移。在移位策略上,有逻辑移位和算术移位。两个维度互相组合有4中组合。
逻辑左移=算数左移,右边统一添0
逻辑右移,左边补上符号位
算术右移,左边补 0
e.g:1010101010,其中[]是添加的位
逻辑左移一位:010101010[0]
算数左移一位:010101010[0]
逻辑右移一位:[0]101010101
算数右移一位:[1]101010101
左移
首先,左移运算会溢出符号位,负数在左移之后可能会变成正数。在小于变量容器一半的变量可以通过左移一位来做乘2的运算。在不考虑溢出的情况下,其左移后的数与左移前的数关系如下:
1 | a << 1 => a = a * 2^1; |
逻辑右移和算术右移
逻辑右移也有和左移一样的规律,但是除法会丢失小数点精度
1 | // 逻辑右移 |
1 | 将 1010 1010 做逻辑右移 |
用 java 做算术右移,要小心 byte 在算术右移中会自动转型为 int ,高位补1,导致的byte计算时逻辑右移和算术右移结果一致。
1 | /* |