如何用C语言设置位并打印所有位?位索引与位命名差异疑问
这是个非常典型的新手容易踩的坑!核心问题就是编程里的位索引和日常口语中的位命名规则不一样,我来给你掰扯清楚:
位索引 vs 位命名的差异
在计算机编程中,所有的位都是从0开始索引的——最右边的那个最低位(LSB)是第0位,然后向左依次是第1位、第2位……直到最左边的最高位(MSB)。
而我们日常说话时,习惯从1开始数“第1位、第2位”,这就导致了错位:比如你用1 << 5操作,实际上是把索引为5的位设为1,但按日常从1数的习惯,这个位就是“第6位”——这就是你看到printBits输出里1在第6个位置的原因。
C语言正确设置位的方法
要设置某个位,核心是用**按位或(|)**操作,结合移位:
- 如果要设置索引为n的位(从0开始):
target_value |= (1 << n); - 如果要设置日常说的第k位(从1开始):
target_value |= (1 << (k-1));
比如你想设置日常说的“第5位”,就应该用1 << 4,而不是1 << 5。
正确的printBits实现
你的printBits输出看起来是从最低位到最高位打印的(或者说顺序搞反了),这也加剧了误解。一个符合日常阅读习惯的printBits应该从最高位到最低位打印(左边是高位,右边是低位),示例代码如下:
#include <stdio.h> // 打印32位无符号整数的所有位,从最高位(第31位)到最低位(第0位) void printBits(unsigned int val) { for (int i = 31; i >= 0; i--) { // 取出第i位的值:右移i位后和1做按位与 int bit = (val >> i) & 1; printf("%d ", bit); } printf("\n"); } int main() { unsigned int num = 0; // 示例1:设置索引为5的位(日常说的第6位) num |= (1 << 5); printf("设置索引5的位(第6位)后:\n"); printBits(num); // 示例2:设置日常说的第5位(索引4) num = 0; num |= (1 << 4); printf("设置日常说的第5位后:\n"); printBits(num); return 0; }
运行这段代码,你会看到:
- 设置
1 << 5时,输出的第27个位置(从左数)是1(因为31-5=26,索引从0开始),对应32位二进制里的第6位(从右数); - 设置
1 << 4时,输出的第28个位置是1,对应日常说的第5位。
这样就能清晰对应上你想要的位位置了。
内容的提问来源于stack exchange,提问作者ElConrado
相关产品推荐
相关产品推荐

