《C程序设计语言(第2版新版)典藏版》 —2.9 位运算符

举报
华章计算机 发表于 2019/12/06 20:34:08 2019/12/06
【摘要】 本节书摘来自华章计算机《C程序设计语言(第2版新版)典藏版》一书中第2章,第2.9节,作者是[美]布莱恩W. 克尼汉 (Brian W. Kernighan) 丹尼斯M. 里奇 (Dennis M. Ritchie),徐宝文 李志译 尤晋元 审校。

2.9   位运算符

C语言提供了6个位操作运算符。这些运算符只能作用于整型操作数,即只能作用于带符号或无符号的char、short、int与long类型:

&   按位与(AND)

   按位或(OR)

^   按位异或(XOR)

<<   左移

>>   右移

~   按位求反(一元运算符)

按位与运算符&经常用于屏蔽某些二进制位,例如:

image.png

该语句将n中除7个低二进制位外的其他各位均置为0。

按位或运算符  常用于将某些二进制位置为1,例如:

image.png

该语句将x中对应于SET_ON中为1的那些二进制位置为1。

按位异或运算符^用于当两个操作数的对应位不相同时将该位置为1,否则,将该位置为0。

我们必须将位运算符&、 同逻辑运算符&&、||区分开来,后者用于从左至右求表达式的真值。例如,如果x的值为1,y的值为2,那么,x&y的结果为0,而x&&y的值为1。

移位运算符<<与>>分别用于将运算的左操作数左移与右移,移动的位数则由右操作数指定(右操作数的值必须是非负值)。因此,表达式x<<2将把x的值左移2位,右边空出的2位用0填补,该表达式等价于对左操作数乘以4。在对unsigned类型的无符号值进行右移时,左边空出的部分将用0填补;当对signed类型的带符号值进行右移时,某些机器将对左边空出的部分用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。

一元运算符~用于求整数的二进制反码,即分别将操作数各二进制位上的1变为0,0变为1。例如:

image.png

将把x的最后6位设置为0。注意,表达式x&~077与机器字长无关,它比形式为x&0177700的表达式要好,因为后者假定x是16位的数值。这种可移植的形式并没有增加额外开销,因为~077是常量表达式,可以在编译时求值。

为了进一步说明某些位运算符,我们来看函数getbits(x,p,n),它返回x中从右边第p位开始向右数n位的字段。这里假定最右边的一位是第0位,n与p都是合理的正值。例如,getbits(x,4,3)返回x中第4、3、2三位的值。

image.png

其中,表达式x>>(p+l-n)将期望获得的字段移位到字的最右端。~0的所有位都为1,这里使用语句~0<<n将~0左移n位,并将最右边的n位用0填补。再使用~运算对它按位取反,这样就建立了最右边n位全为1的屏蔽码。

练习2-6   编写一个函数setbits(x,p,n,y),该函数返回对x执行下列操作后的结果值:将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变。

练习2-7   编写一个函数invert(x,p,n),该函数返回对x执行下列操作后的结果值:将x中从第p位开始的n个(二进制)位求反(即1变成0,0变成1),x的其余各位保持不变。

练习2-8   编写一个函数rightrot(x,n),该函数返回将x循环右移(即从最右端移出的位将从最左端移入)n(二进制)位后所得到的值。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。