摘要

位操作是程序设计中对位模式按位或二进制数的一元和二元操作。在许多古老的微处理器上,位运算比加减运算略快,通常位运算比乘除法运算要快很多。在现代架构中,情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算)。移位是一个二元运算符,用来将一个二进制数中的每一位全部都向一个方向移动指定位,溢出的部分将被舍弃,而空缺的部分填入一定的值。

 

程序设计中,位操作运算符的一种。在c++中,移位运算符有双目移位运算符:<<(左移)和>>(右移)。移位运算符组成的表达式也属于算术表达式,其值为算术值。左移运算是将一个二进制位的操作数按指定移动的位数向左移位,移出位被丢弃,右边的空位一律补0。右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位或者一律补0,或者补符号位,这由不同的机器而定。在使用补码作为机器数的机器中,正数的符号位为0,负数的符号位为1。
在移位运算时,byte、short和char类型移位后的结果会变成int类型,对于byte、short、char和int进行移位时,规定实际移动 的次数是移动次数和32的余数,也就是移位33次和移位1次得到的结果相同。移动long型的数值时,规定实际移动的次数是移动次数和64的余数,也就是 移动66次和移动2次得到的结果相同。

实例:

[root@Legion10 ~]# echo 233 | awk '{print lshift($1,5),rshift($1,5),$1}'
7456 7 233
[root@Legion10 ~]# 

解析:

[root@Legion10 ~]# echo 233 | awk '{print lshift($1,5),rshift($1,5),$1}'
7456 7 233
[root@Legion10 ~]# cat 2
dec             bin             |       dec                     bin
233             0000011101001   |       233                     11101001
7456            1110100100000   |       7                       00000111
----左移5位-------------        |   ----右移5位------------

[root@Legion10 ~]#

awk_lshift_rshift2015_09_17_01_34_20

来个右移位运算计算ip

[root@Legion10 ~]# echo 134744072|awk '{
	a=0xFF000000;
	b=0xFF0000;
	c=0xFF00;
	d=0xFF;
	e=rshift(and($1,a),24);
	f=rshift(and($1,b),16);
	g=rshift(and($1,c),8);
	h=and($1,d);
	printf("%d.%d.%d.%d\n",e,f,g,h)
}'

8.8.8.8
[root@Legion10 ~]#

awk_rshift_ip2015_09_17_01_56_52

posted on 2020-04-11 10:28  知识天地  阅读(733)  评论(0编辑  收藏  举报