十进制转32位二进制

converting decimal to 32 bit binary

您好,我一直在为我的 C 语言编程分配作业 class,我遇到的一个问题是这个。 "提示用户输入 0 到 2147483647含,然后显示转换后的 值为 32 位二进制数,以 1 space 分隔 二进制值中的每个 8 位。如果一个无效的数字 已输入(即 < 0 或 > 2147483647)” 它要我输出 32 位格式的二进制文件,例如 00000000 00000000 00000000 00011111 =31,所有 0 和每组 8 之间的间距,我被卡住了。

 printf("enter a valid integer between 0 and 2147483647\n");
                 scanf("%d",&decimal);
                 fflush(stdin);
                 if (decimal>0||decimal<2147483647)
                   {while (decimal!=0)
                   {
                          remainder = decimal%2;
                          binary=(remainder*place)+binary;
                          decimal=decimal/2;
                          place=place*10;}
                   printf("%d",binary);}

这种方法一直有效,直到输入超过 1000,然后它才变得混乱。也不确定为什么。

问题是 binary 不够大,无法容纳 32 个 0 和 1。您可能会注意到,允许的最大数量约为 10 位十进制数字。这就是 int 在大多数系统上可以存储的全部内容。

您可以在计算每个二进制数字时立即单独显示它,或者将它们存储在一个数组中,稍后再显示。

你知道数字在内存中是二进制存储的,对吧?所以你可以一个一个地检查每一位,然后打印出结果:

您可以使用位运算符检查位。您可以通过 左移 数字 31 位:1<<31 从数字 1 创建二进制数 1000 0000 0000 0000。然后,您可以使用 bitwise-and: (1<<31) & decimal 检查您的号码是否设置了第 32 位。如果结果为零,则该位未设置。如果结果非零,则该位已设置。

假设单位值(这通常称为掩码)存储在unsigned int中,您可以通过右移检查第31位一次:

unsigned int mask = 1 << 31; // mask for 32nd bit
mask = mask >> 1; // move mask to 31st bit
if (mask & decimal != 0) {
  // 31st bit is set
}
else {
  // not set
}

使用 unsigned int 非常重要。如果您使用普通(带符号)int,则 >> 运算符具有不同的行为。对于无符号数,当右移时,左侧用零填充。对于有符号数,左侧用最高位中的任何值(0 或 1)填充。所以,如果你有 signed 二进制值 1000 0000 0000 0000 并且你将它右移 1 (signed_mask >> 1),那么你最终会得到 1100 0000 0000 0000 而不是比 0100 0000 0000 0000.

这是一个工作示例:

#include <stdio.h>

int main(int argc, char *argv[]) {
    int i, j, decimal;
    printf("enter a valid integer between 0 and 2147483647\n");
    scanf("%d",&decimal);
    fflush(stdin);
    // all signed integers are <= 2147483647, so just check if it's positive
    if (decimal>0) { 
        // create a "mask" to look at the 32nd bit
        // note that we use an unsigned mask!
        // this is important because we don't want
        // sign-extending when we shift to the next bit.
        unsigned int mask = 1<<31;
        for (i=0; i<8; i++) {
            for (j=0; j<4; j++) {
                // check current bit, and print
                char c = (decimal & mask) == 0 ? '0' : '1';
                putchar(c);
                // move down one bit
                mask >>= 1;
            }
            // print a space very 4 bits
            putchar(' ');
        }
        putchar('\n');
    }
    return 0;
}

请注意您代码中的条件 decimal>0||decimal<2147483647 始终为真。我认为您打算使用 &&,而不是 ||。但是,2147483647 是带符号的 32 位整数 (231-1) 的最大值,因此检查上限实际上没有意义。