左移动运算符 <<
运算规则: x << y 将x的二进制形式向左移动y个位置,左侧移除,右侧补0
7 << 2 = 28
0000 0111 --7
<< 2
-------------------
0001 1100 -- 4+8+16 = 28
右移动运算符 >>
运算规则: x >> y 将x的二进制形式向右移动y个位置,右侧移除,左侧补0
7 >> 2 = 1
0000 0111 --7
>> 2
-------------------
0000 0001 --1
printf("%d >> %d = %d", 7, 2, 7 >> 2); // 1
左移右移动可以干什么
例:取某二进制数的某一段数据,如第三~第五位
整数m 二进制形式为 xxnn nxxx
想获得 nnn
段可以m >> 3 得到 000x xnnn
把要截取的段移到低位 利用&的 0 & x = 0,1 & x = 1的性质构建一个和000x xnnn
相&后能得到nnn
的二进制,即为0000 0111
也就是十进制的7,这样0对应不需要的位置&后都是0,1对应需要的位置结果就是
000x xnnn
& 0000 0111 --7
----------------
0000 0nnn
这样就得到了m的第三到第五位nnn
循环移动
形如: 将m左移动n位 被移除的n位放在m的右边 :
nnnx xxx
=>xxxx xnnn
或,将m右移动n位 被移除的n位放在m的左边:xxxx xnnn
=>nnnx xxxx
循环左移
公式 m << n | m >> 8-n
比如想 nnnx xxxx 变成 xxxx xnnn 需要用到循环左移
m << 3 : xxxx x000
m >> 8-3 : 0000 0nnn
m << 3 | m >> 5 :xxxx x000 | 0000 0nnn ----------------------- (0 | x = x) xxxx xnnn
循环右移
公式 m >> n | m << 8-n
比如想 xxxx xnnn 变成 nnnx xxxx 需要用到循环左移
m >> 3 : 000x xxxx
m << 8-3 : nnn0 0000
m >> 3 | m << 5 :000x xxxx | nnn0 0000 ----------------------- (0 | x = x) nnnx xxxx