关于基于位运算符的十进制转二进制代码循环逻辑的疑问
解释十进制转二进制代码中的位运算循环逻辑
先看你提供的这段C代码:
#include <stdio.h> int main() { int decimal_num, c, result; printf("Enter an integer in decimal number system\n"); scanf("%d", &decimal_num); for (c = 31; c >= 0; c--) { result = decimal_num >> c; if (result & 1) printf("1"); else printf("0"); } printf("\n"); return 0; }
你疑惑的核心是循环里的result = decimal_num >> c和整个循环的运行逻辑,我来逐个拆解:
1. 循环的整体目标
这段代码要把输入的十进制整数转换成32位二进制数(大多数系统中int类型是4字节=32位),所以循环从c=31(最高位的位置)一直遍历到c=0(最低位的位置),逐个取出每一位的二进制值并打印。
2. decimal_num >> c:右移运算符的作用
>>是右移位运算符,它会把decimal_num的二进制表示整体向右移动c位,右边移出的位被丢弃,左边补符号位(正数补0,负数补1)。
举个直观例子:假设输入的decimal_num是5,它的32位二进制是00000000 00000000 00000000 00000101。
- 当
c=2时,5 >> 2就是把二进制向右移2位,得到00000000 00000000 00000000 00000001(十进制的1); - 当
c=1时,5 >> 1得到00000000 00000000 00000000 00000010(十进制的2); - 当
c=0时,右移0位等于原数,也就是5本身。
这个操作的核心目的是:把我们要检查的那一位(第c位)移动到最低位(第0位),方便后续判断它是0还是1。
3. result & 1:判断当前位的取值
&是按位与运算符,1的二进制是000...0001(只有最低位是1,其他都是0)。当我们把目标位移到最低位后,用result & 1做运算:
- 如果最低位是1,结果就是1,打印"1";
- 如果最低位是0,结果就是0,打印"0"。
结合上面的例子:
5 >> 2得到1,1 & 1=1 → 打印"1"(对应原数的第2位);5 >> 1得到2,2 & 1=0 → 打印"0"(对应原数的第1位);5 >> 0得到5,5 & 1=1 → 打印"1"(对应原数的第0位)。
4. 整个循环的运行流程
从c=31开始,每次循环:
- 把
decimal_num右移c位,把第c位移到最低位; - 通过
&1判断该位是0还是1,打印对应的字符; c减1,处理下一位,直到c=0(最低位)处理完成。
这样就能完整输出32位的二进制数,包括前面的所有高位0。
内容的提问来源于stack exchange,提问作者Ganesh Thampi
相关产品推荐
相关产品推荐

