4.5 位运算符

4.5 位运算符 - 图1

表4-2列出的所有运算符,除一次求反运算符(~)外,都是二元运算符,因此需要两个运算数。位运算符可处理任何类型的整型值,但不能处理浮点值。</p>

4.5.1 按位与运算符

对两个值执行与运算时,会逐位比较两个值的二进制表示。第一个值与第二个值对应位都为1时,在结果的对应位上就会得到1;其他的组合在结果中都得到0。如果b1和b2表示两个运算数的对应位,那么下表(称为真值表)就显示了在b1和b2所有可能值下对b1和b2执行与操作的结果。


b1 b2 b1&b2


0 0 0

0 1 0

1 0 0

1 1 1


例如,如果w1和w2都定义为short int, w1等于十六进制的15,w2等于十六进制的0c,那么以下C语句会将值0x04指派给w3:

w3=w1&w2;

将w1、w2和w3都表示为二进制后可更清楚地看到此过程。假设所处理的short int大小为16位:


w1 0000 0000 0001 0101 0x15

w2 0000 0000 0000 1100&0x0c


w3 0000 0000 0000 0100 0x04


按位与运算经常用于屏蔽运算。就是说,这个运算符可轻易地将数据项的特定位设置为0。例如,语句


w3=w1&3;


将w1与常量3按位与所得的值指派给w3。它的作用是将w3中的全部位(而非最右边的两位)设置为0,并保留w1中最左边的两位。

与Objective-C中使用的所有二元运算符相同,通过添加等号,二元位运算符可同样用作赋值运算符。因此语句


word&=15;


与下列语句


word=word&15;


执行相同的功能。

此外,它还能将word的全部位设置为0,但最右边的四位除外。