使用位运算符将十进制转换为二进制

3
#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;
}

这段代码使用按位运算符将十进制数转换为二进制数。我很难理解for循环中的逻辑,即为什么要使用result = decimal_num >> c,以及为什么需要从for (c = 31; c >= 0; c--)开始迭代。我了解按位AND、OR、XOR和NOT的基本知识,并且知道当奇数与'1'进行AND运算时,结果为'1'否则为'0'(因为所有奇数的最低有效位都为1)。

2
使用调试器逐行查看代码。并了解更多关于移位运算符的内容。 - Some programmer dude
0-31:32 次迭代,这应该与该机器上 int 类型的位大小有关。decimal_num>>c + result&1 看起来像是隔离和检查单个比特的操作... 请阅读有关移位的内容。 - Jean-Baptiste Yunès
1个回答

9
以下是代码的解释:
该程序从左到右扫描十进制数字的位表示,逐位处理。 十进制数字应具有32位,因此for循环运行32次。
第一次,c的值为31。
假设decimal_num的位表示最初为 x................................ (.代表任何数字)
decimal_num >> 31将所有位向右移动31次,因此第一位移动到最右端。 结果为0000000000000000000000000000x。请注意,在移位时,0会在左端预先添加。
然后检查结果是否为0或1,并相应地打印。 如果x为1,则0000000000000000000000000000x & 00000000000000000000000000001 = 1 如果x为零,则0000000000000000000000000000x & 00000000000000000000000000001 = 0。
继续前进,在c为30时检查第二位。 :
.Y..............................
decimal_num >> 30的结果为 000000000000000000000000000000.Y
000000000000000000000000000.Y & 00000000000000000000000000001 = 1,如果Y为1 000000000000000000000000000.Y & 00000000000000000000000000001 = 0,如果Y为0。
我们继续打印结果,直到最后一个数字。
希望这有助于您的理解。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接