左/右移运算符,循环左/右移运算

左移动运算符 <<

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

扫描二维码关注公众号,回复: 12916703 查看本文章
   000x xxxx
|  nnn0 0000
----------------------- (0 | x = x)
   nnnx xxxx

猜你喜欢

转载自blog.csdn.net/printf_hello/article/details/114245036