这是一个非常基础且重要的操作,涉及到 位运算 中的 按位与 运算。

(图片来源网络,侵删)
核心概念:按位与
按位与运算符是 &,它的作用是将两个整数的二进制表示的每一位进行与运算。
与运算的规则是:
1 & 1 = 11 & 0 = 00 & 1 = 00 & 0 = 0
只有当参与运算的两个对应位都为1时,结果的该位才为1,否则为0。
代码解析:c = b & 15;
这行代码可以分解为三个部分来理解:

(图片来源网络,侵删)
-
15: 这是一个整数,在按位运算中,我们通常关心它的二进制形式。- 十进制
15的二进制是1111。 - 在大多数现代计算机系统中,
int类型是 32 位的,15的完整二进制表示是0000 0000 0000 0000 0000 0000 0000 1111。
- 十进制
-
b: 这是一个整型变量,我们假设它已经被赋值了,为了理解这个运算的效果,我们用一个例子来演示,假设b的值是231。- 十进制
231的二进制是1110 0111。 - 同样,它的 32 位完整表示是
0000 0000 0000 0000 0000 0000 1110 0111。
- 十进制
-
b & 15: 这是执行按位与运算。- 我们将
b和15的二进制数对齐,进行逐位与运算:
b: 0000 0000 0000 0000 0000 0000 1110 0111 15: 0000 0000 0000 0000 0000 0000 0000 1111 -------------------------------------------- 结果: 0000 0000 0000 0000 0000 0000 0000 0111- 计算过程分析:
b的高 28 位都是0,15的高 28 位也都是0,所以结果的高 28 位都是0 & 0 = 0。b的低 4 位是0111,15的低 4 位是1111,我们逐位计算:0 & 1 = 01 & 1 = 11 & 1 = 11 & 1 = 1
- 结果的低 4 位是
0111。
- 我们将
-
c = ...: 将上一步计算出的结果赋值给变量c。
(图片来源网络,侵删)- 二进制结果
0000 0000 ... 0000 0111转换为十进制就是7。 - 执行完这行代码后,变量
c的值就是7。
- 二进制结果
常见用途:按位与掩码
b & 15 这种写法在 C 语言中非常常见,它的主要用途是“屏蔽”或“提取”特定位的值,这里的 15 被称为掩码。
在这个例子中:
- 目的:提取变量
b的最低 4 位。 - 原理:因为
15的二进制是...0000 1111,它除了最低 4 位是1,其余位都是0。- 任何数与
0进行按位与,结果都会变成0。b的高位(除了最低4位之外的所有位)都会被15的0给“屏蔽”掉,变成0。 - 任何数与
1进行按位与,结果保持不变。b的最低 4 位会保留下来。
- 任何数与
一个更通用的公式:
要提取一个数的最低 n 位,可以使用 number & ( (1 << n) - 1 )。
- 提取最低 4 位:
b & ( (1 << 4) - 1 )->b & (16 - 1)->b & 15。 - 提取最低 8 位:
b & ( (1 << 8) - 1 )->b & (256 - 1)->b & 255。
完整代码示例
下面是一个完整的 C 语言程序,你可以自己编译运行来验证结果。
#include <stdio.h>
int main() {
int b = 231;
int c;
// 执行按位与运算
c = b & 15;
// 打印结果
printf("b 的值是: %d (十进制)\n", b);
printf("b 的二进制是: "); // 假设我们有一个函数来打印二进制
print_binary(b);
printf("\n");
printf("15 的二进制是: ");
print_binary(15);
printf("\n");
printf("c = b & 15 的结果是: %d (十进制)\n", c);
printf("c 的二进制是: ");
print_binary(c);
printf("\n");
return 0;
}
// 一个辅助函数,用于打印一个整数的二进制形式
void print_binary(int num) {
// 假设是32位整数
for (int i = 31; i >= 0; i--) {
// (num >> i) 将第 i 位移动到最右边
// & 1 获取该位的值
printf("%d", (num >> i) & 1);
// 每8位加一个空格,方便阅读
if (i % 8 == 0 && i != 0) {
printf(" ");
}
}
}
运行结果:
b 的值是: 231 (十进制)
b 的二进制是: 00000000 00000000 00000000 11100111
15 的二进制是: 00000000 00000000 00000000 00001111
c = b & 15 的结果是: 7 (十进制)
c 的二进制是: 00000000 00000000 00000000 00000111
c = b & 15; 这行代码的作用是:
- 操作:对变量
b和整数15进行按位与运算。 - 效果:提取
b的最低 4 位,并将其余高位全部置为0。 - 结果:将得到的新值存入变量
c中。 - 应用:这是一种非常高效的位操作技巧,常用于从数据中提取特定信息,例如检查某个开关的状态、从数据包中提取标志位等。
