2.9 按位运算符

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

按位与

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

n = n & 0177

该语句将 n 中除 7 个低二进制位外的其他各位均置为 0,举个例子:

int n = 100;
n = n & 177;
printf("n 的结果是:%d", n);
// n 的结果是32

100 的二进制是 01100100,177 的二进制是 10110001,经过按位与运算后的结果是 00100000。运算规则是两者都为 1 时才返回 1,比如从左算起第一位分别是 0 和 1,所以结果是 0。从左算起第三位分别是 1 和 1 ,所以结果为 1。

按位或

按位或是只要有一方为 1,结果就是 1:

n = n | 0177

按位异或

当两个操作数的对应位不相同时将该位设置为 1,否则,将该位设置为 0。即只要不相同,计算结果就是 1,即使两者都为 1,返回结果也是 0。

移位运算 <<>>

将运算的左操作数左移和右移,移动的位数由右操作数指定(必须为非负值)。

// 表示将 x 值左移两位,右边空出的两位用 0 填补
//该表达式等价于对左操作数乘以4
x<<2
//假设 x=10
//计算过程是这样的,10的二进制是 1010
//向左移两位 1010 -> 101000,即 40

在对 unsigned 类型的无符号值进行右移位时,左边空出的部分将用 0 填补;
当对 signed 类型的带符号值进行右移时,某些机器将对左边空出的部分用符号位填补(“即算符移位”),而另一些机器则对左边空出的部分用 0 填补(即“逻辑移位”)。

按位求反 ~

用于求整数的二进制反码,即分别将操作数各二进制位上的 1 变成 0,0 变成 1。

// 将把 x 的最后 6 位设置为 0.
x=x & ~077

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