2015-11-07 597 views
0

嗨我一直在给我的C语言程序设计一个任务,并且一个问题就是这个。 “提示用户0和 2147483647(含)之间输入有效的整数,并且然后用1个空间中的二进制值分离 每个8位显示转换 值作为一个32位的二进制数。如果一个无效的数字 (即< 0或> 2147483647)“ 它希望我以32位格式输出二进制数,例如00000000 00000000 00000000 00011111 = 31,全部为0,每组8位之间的间距和卡住。将十进制转换为32位二进制

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然后它得到搞砸。也不确定为什么。

+1

通常您需要先发布您的尝试(如果它不对,请不要担心)。 – artm

+0

提供[mcve]。 – Olaf

+1

'fflush'ing'stdin'是未定义的行为。 – Olaf

回答

1

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

可以使用位运算符检查位。你可以从1创建二进制数1000 0000 0000 0000左移数31位:1<<31。然后你可以检查你的号码是否有第012位设置为按位和(1<<31) & 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,那么运算符>>具有不同的行为。对于无符号数字,右移时,左侧填充零。对于带符号的数字,左侧将填充任何值(0或1)在最高位。所以,如果你有签署的二进制值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位整数的最大值(2 -1),因此检查上限没有实际意义。

2

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

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