本文摘自http://blog.csdn.net/briblue/article/details/70296326
右移运算符(>>)
规则a >> b 将数值 a 的二进制数值从 0 位算起到第 b - 1 位,整体向右方向移动 b 位,符号位不变,高位空出来的位补数值 0。
5>>1 ===> 1000000000000101>>1 = 1000000000000010 = 2
7>>2 ===> 1000000000000111>>2 = 1000000000000001 = 1
9>>3 ===> 1000000000001001>>3 = 1000000000000001 = 1
11>>2 ===> 1000000000001011>>2 = 1000000000000010 = 2
大家发现什么规律没有?a >> b = a / ( 2 ^ b ) ,所以 5 >> 1= 5 / 2 = 2,11 >> 2 = 11 / 4 = 2。
左移运算符(<<)
规则a << b 将数值 a 的二进制数值从 0 位算起到第 b - 1 位,整体向左方向移动 b 位,符号位不变,低位空出来的位补数值 0。
5<<1 ===> 1000 0000 0000 0101<<1 = 1000000000001010 = 10
7<<2 ===> 1000 0000 0000 0111<<2 = 1000000000011100 = 28
9<<3 ===> 1000 0000 0000 1001<<3 = 1000000001001000 = 72
11<<2 ===> 1000 0000 0000 1011<<2 = 1000000000101100 = 44
很明显就可以看出 a << b = a * (2 ^ b)
综合上面两个可以看到,如果某个数值右移 n 位,就相当于拿这个数值去除以 2 的 n 次幂。如果某个数值左移 n 位,就相当于这个数值乘以 2 ^ n。