个人网站:生命不息 折腾不止
1、左移运算符:<<
先随便定义一个int类型的数int,十进制的value = 733183670,转换成二进制在计算机中的表示如下:
value << 1,左移1位
左移1位后换算成十进制的值为:1466367340,刚好是733183670的两倍, 有些人在乘2操作时喜欢用左移运算符来替代。
value << 8,左移8位看一下:
左移8位后变成了十进制的值为:-1283541504,移动8位后,由于首位变成了1,也就是说成了负数,在使用中要考虑变成负数的情况。
根据这个规则,左移32位后,右边补上32个0值是不是就变成了十进制的0了?答案是NO,当int类型进行左移操作时,左移位数大于等于32位操作时,会先求余(%)后再进行左移操作。也就是说左移32位相当于不进行移位操作,左移40位相当于左移8位(40%32=8)。当long类型进行左移操作时,long类型在二进制中的体现是64位的,因此求余操作的基数也变成了64,也就是说左移64位相当于没有移位,左移72位相当于左移8位(72%64=8)
注意:其它几种整形byte,short移位前会先转换为int类型(32位)再进行移位。
综上所述:左移 << 其实很简单,也就是说丢弃左边指定位数,右边补0。
2、右移运算符:>>
还是这个数:733183670
value >> 1,右移1位
右移1位后换算成十进制的值为:366591835,刚好是733183670的1半, 有些人在除2操作时喜欢用右移运算符来替代
value >> 8,右移8位看一下
和左移一样,int类型移位大于等于32位时,long类型大于等于64位时,会先做求余处理再位移处理,byte,short移位前会先转换为int类型(32位)再进行移位。以上是正数的位移,我们再来看看负数的右移运算,如图,负数intValue:-733183670的二进制表现如下图:
右移8位,intValue >> 8
综上所述:右移运算符>>的运算规则也很简单,丢弃右边指定位数,左边补上符号位。
3、无符号右移运算符:>>>
无符号右移运算符>>>和右移运算符>>是一样的,只不过右移时左边是补上符号位,而无符号右移运算符是补上0,也就是说,对于正数移位来说等同于:>>,负数通过此移位运算符能移位成正数。以-733183670>>>8为例来画一下图
无符号右移运算符>>的运算规则也很简单,丢弃右边指定位数,左边补上0。
4. 快速算出移位运算符结果的方法(只适用小数值):
在不大于自身数值类型最大位数的移位时,一个数左移n位,就是将这个数乘以2的n次幂;一个数右移n位,就是将这个数除2的n次幂,然后取整。
比如int32位的(64位也是同样方法):
7 >> 1 = 7/2 取整为3
7 << 1 = 7*2 为14
如果移动位数超过了32位怎么办?把移位数和32取余数得到的数字套用即可:
如 9 >> 67
1、先67对32取余,结果是3
2、然后9/8 得到结果为1