将十进制转换为32位二进制

时间:2015-11-07 00:24:37

标签: c binary decimal

嗨,我一直在为我的C类编程做一个作业,我坚持的问题是这个。 “提示用户输入0到0之间的有效整数 2147483647包含,然后显示转换后的 值为32位二进制数,1个空格分隔 二进制值中的每个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然后它搞砸了。也不确定为什么。

2 个答案:

答案 0 :(得分:2)

问题在于binary不足以容纳32 0和1。{0}。您可能会注意到允许的最大数量大约是10个十进制数字。所有int都可以存储在大多数系统上。

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

答案 1 :(得分:1)

你知道数字存储在内存中的二进制中,对吗?因此,您可以逐个检查每个位,并在出发时打印出结果:

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

假设单比特值(通常称为掩码)存储在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 } 中,您可以通过右移一次来检查第31位:

unsigned int

使用int非常重要。如果您使用普通(签名)>>,则1000 0000 0000 0000运算符会有不同的行为。对于无符号数字,当向右移动时,左侧用零填充。对于带符号的数字,左侧用任何值(0或1)填充最高位。因此,如果你有签名的二进制值signed_mask >> 1并且你将其右移1(1100 0000 0000 0000),那么你最终会得到0100 0000 0000 0000而不是{{} 1}}。

这是一个有效的例子:

#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 始终为true 。我认为您打算使用&&,而不是||。但是,2147483647是带符号的32位整数(2 31 -1)的最大值,因此检查上限实际上没有意义。