十进制转32位二进制
converting decimal to 32 bit binary
您好,我一直在为我的 C 语言编程分配作业 class,我遇到的一个问题是这个。
"提示用户输入 0 到
2147483647含,然后显示转换后的
值为 32 位二进制数,以 1 space 分隔
二进制值中的每个 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,然后它才变得混乱。也不确定为什么。
问题是 binary
不够大,无法容纳 32 个 0 和 1。您可能会注意到,允许的最大数量约为 10 位十进制数字。这就是 int
在大多数系统上可以存储的全部内容。
您可以在计算每个二进制数字时立即单独显示它,或者将它们存储在一个数组中,稍后再显示。
你知道数字在内存中是二进制存储的,对吧?所以你可以一个一个地检查每一位,然后打印出结果:
您可以使用位运算符检查位。您可以通过 左移 数字 31 位:1<<31
从数字 1
创建二进制数 1000 0000 0000 0000
。然后,您可以使用 bitwise-and: (1<<31) & decimal
检查您的号码是否设置了第 32 位。如果结果为零,则该位未设置。如果结果非零,则该位已设置。
假设单位值(这通常称为掩码)存储在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)填充。所以,如果你有 signed 二进制值 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 位整数 (231-1) 的最大值,因此检查上限实际上没有意义。
您好,我一直在为我的 C 语言编程分配作业 class,我遇到的一个问题是这个。 "提示用户输入 0 到 2147483647含,然后显示转换后的 值为 32 位二进制数,以 1 space 分隔 二进制值中的每个 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,然后它才变得混乱。也不确定为什么。
问题是 binary
不够大,无法容纳 32 个 0 和 1。您可能会注意到,允许的最大数量约为 10 位十进制数字。这就是 int
在大多数系统上可以存储的全部内容。
您可以在计算每个二进制数字时立即单独显示它,或者将它们存储在一个数组中,稍后再显示。
你知道数字在内存中是二进制存储的,对吧?所以你可以一个一个地检查每一位,然后打印出结果:
您可以使用位运算符检查位。您可以通过 左移 数字 31 位:1<<31
从数字 1
创建二进制数 1000 0000 0000 0000
。然后,您可以使用 bitwise-and: (1<<31) & decimal
检查您的号码是否设置了第 32 位。如果结果为零,则该位未设置。如果结果非零,则该位已设置。
假设单位值(这通常称为掩码)存储在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)填充。所以,如果你有 signed 二进制值 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 位整数 (231-1) 的最大值,因此检查上限实际上没有意义。