吐槽一下osc的markdown编辑器, 发布后的效果简直惨不忍睹. 下面如果看的凌乱, 来这里看吧.
简介
Java中有左移运算符(<<), 右移运算符(>>) 和 无符号右移运算符(>>>),
用它们来进行运算, 比用 乘法运算符(*), 除法运算符(/)拥有更高的执行效率. 那么如何来用它们进行运算呢?先说结论
a >> 1 == a / 2;a >> 2 == a / 2 / 2;a >> 3 == a / 2 / 2 / 2;a << 1 == a * 2;a << 2 == a * 2 * 2;a << 3 == a * 2 * 2 * 2;
右移推导过程
int a = 64; a >> 2
;a
的二进制表示形式:0100 0000
右移两位:--0100 0000
高位(左边)补零, 低位(右边)丢弃:0001 0000
转为十进制:16
左移推导过程
int b = 3; b << 2
;b
的二进制表示形式:0000 0011
左移两位:0000 0011--
高位(左边)丢弃, 低位(右边)补零:0000 1100
转为十进制:12
对于负数的左移, 右移
负数的左移, 右移, 和上面的推导过程唯一的区别就是:
正数补零, 负数补一
int c = -64; a >> 2
;c
的二进制表示形式:1100 0000
右移两位:--1100 0000
高位(左边)补一
, 低位(右边)丢弃:1111 0000
转为十进制:-16
无符号右移(>>>)
对于正数, (>>>) 效果等同于 (>>)
对于负数, 我们对二进制数据做位移的时候, 需要把二进制数据的宽度转换为32位或64位宽度十进制和二进制转换
关于32位宽度和64位宽度
如何得到负数的32位宽度, 或64位宽度呢?
参考
. 这里是列表文本