二进制的移位运算

java的移位运算有三种:左移<<,有符号右移>>,无符号右移>>>
 
对于左移<<,不管正负数,操作数右边的低位以0补齐,相当于乘以2的n次方,n为移动的位数。
比如1<<2,0000 0001位移两位的话,变为0000 0100,也就是4。
其实相当于1乘以2的2次方,得到结果为4,-1<<2类似,得到的结果为-4
 
但1<<32,可以想象二进制的移位,那个1移到了尽头,这时最低位不在补0,而是补1,从而得到的结果为1其自身
 
其实操作数移位的位数若超过本身类型占用位数,比如Int类型数据超过32位,那么移位的位数就相当于0,也就是移位的位数总是n%类型占用位数
大白话可能表达不清楚,咱们还是以例子说明
如int类型(占用位数为32位)的数字1,进行操作1<<33,其实相当于1<<33%32,也即1<<1,结果为2
 
对于有符号右移>>,如果是正数,在操作数左边的空位上补0,若是负数,就在左边的空位上补1
 
正数右移,其实相当于除以2的n次方,如4>>1,相当于4除以2,结果为2
负数右移,也类似整数,如-4>>1,相当于-4除以2,结果为-2
 
在移动位数超过操作数最大值之后,正数结果直接为0,负数结果为-1
如:2>>10和2>>12的结果都为0,-2>>10和-2>>12的结果都为-1
 
若超过操作数类型占用位数,那跟上面说的情况是一样的,移动位数还是n%类型占用的位数
 
对于无符号右移>>>,不管正负数,操作数在左边高位补0,情况类似以上。 

猜你喜欢

转载自jjhpeopl.iteye.com/blog/2327792