目录

  • ​​左移动运算符 `<<`​​
  • ​​右移动运算符 `>>`​​
  • ​​左移右移动可以干什么​​
  • ​​循环移动​​
  • ​​循环左移​​
  • ​​循环右移​​
左移动运算符 ​​<<​

运算规则: 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