将十进制转换为32位二进制
嗨我一直在给我的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
创建二进制数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),因此检查上限没有实际意义。
问题是binary
不足以容纳32个0和1个。您可能会注意到,允许的最大数量是大约10个十进制数字。这就是大多数系统都可以存储的int
。
您可能会在计算它们时立即显示每个二进制数字,或将它们存储在数组中并稍后显示。
通常您需要先发布您的尝试(如果它不对,请不要担心)。 – artm
提供[mcve]。 – Olaf
'fflush'ing'stdin'是未定义的行为。 – Olaf