【问题标题】:converting decimal to 32 bit binary将十进制转换为 32 位二进制
【发布时间】:2015-11-07 00:24:36
【问题描述】:

您好,我一直在为我在 C 课上的编程分配一个作业,我一直坚持的一个问题是这个。 "提示用户输入一个介于 0 和 2147483647 含,然后显示转换后的 值作为 32 位二进制数,用 1 个空格分隔 二进制值中的每个 8 位。如果号码无效 已输入(即 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,然后它就搞砸了。也不知道为什么。

【问题讨论】:

  • 通常你需要先发布你的尝试(不要担心它是错误的)。
  • fflushing stdin 是未定义的行为。

标签: c binary decimal


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您知道数字以二进制形式存储在内存中,对吧?因此,您可以逐个检查每一位,并在执行过程中打印出结果:

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

    假设单位值(这通常称为 掩码)存储在 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,则&gt;&gt; 运算符具有不同的行为。对于无符号数,右移时,左侧用零填充。对于有符号数,左侧将填充最高位中的任何值(0 或 1)。因此,如果您有 signed 二进制值 1000 0000 0000 0000 并将其右移 1 (signed_mask &gt;&gt; 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&gt;0||decimal&lt;2147483647始终为真。我认为您的意思是使用&amp;&amp;,而不是||。但是,2147483647 是有符号 32 位整数 (231-1) 的最大值,因此检查上限实际上没有意义。

    【讨论】:

      猜你喜欢
      • 2013-12-26
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 2011-03-05
      • 2020-02-06
      • 2012-01-06
      • 1970-01-01
      相关资源
      最近更新 更多