嗨,我一直在为我的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然后它搞砸了。也不确定为什么。
答案 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)的最大值,因此检查上限实际上没有意义。