《C程序设计语言(第2版新版)典藏版》 —2.9 位运算符
2.9 位运算符
C语言提供了6个位操作运算符。这些运算符只能作用于整型操作数,即只能作用于带符号或无符号的char、short、int与long类型:
& 按位与(AND)
按位或(OR)
^ 按位异或(XOR)
<< 左移
>> 右移
~ 按位求反(一元运算符)
按位与运算符&经常用于屏蔽某些二进制位,例如:
该语句将n中除7个低二进制位外的其他各位均置为0。
按位或运算符 常用于将某些二进制位置为1,例如:
该语句将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。例如:
将把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三位的值。
其中,表达式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(二进制)位后所得到的值。
- 点赞
- 收藏
- 关注作者
评论(0)