C语言学习第十七天
2.9 按位运算符
C语言提供了6个位操作运算符。这些运算符只能作用于整型操作数,即只能作用于带符号或无符号的char、short、int与long类型:
& 按位与(AND)
| 按位或(OR)
^ 按位异或(XOR)
<< 左移
>> 右移
~ 按位求反(一元运算符)
按位与运算符&经常用于屏蔽某些二进制位,例如:
n = n & 0177;
该语句将n中除7个低二进制位外的其他各位均置为0.
按位或运算符|常用于将某些二进制位置为1,例如:
x = x | SET_ON;
该语句将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 = x & ~077
将把x的最后6位设置为0。
为了进一步说明某些位运算符,来看函数getbits(x, p, n) ,它返回x中从右边数第p位开始向右数n位的字段。这里假定最右边的一为时第0位,n与p都是合理的正值。例如,getbits(x, 4, 3)返回x中第4、3、2三位的值。
/* getbits函数: 返回x中从第p位开始的n位 */
unsigned getbits(unsigned x, int p, int n){
return (x >> (p+1-n)) & ~(~0 << n);
}
其中,表达式x>>(p+1-n)将期望获得的字段移位到字的最右端。~0的所有位都为1,这里使用语句~0< 练习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(二进制)位后所得到的值。