我正在练习C的基本程序,并尝试进行二进制到十进制的转换。
下面是我尝试的代码,但它没有产生正确的结果。我不明白我的逻辑哪里出了问题。
/* binary to decimal */
#include<stdio.h>
int main()
{
int a,i,p,sum=0;
printf("enter binary numbern");
scanf("%u",&a);
for(i = 0 ; i < 5; i++) /* Taking only 5 digits in binary */
{
if((a & 1<<i))
{
p = 1<<i;
sum = sum +p;
}
}
printf("%dn",sum);
return 0;
}
我输入 1001 并期望 9 是输出,但输出是 1001?
scanf("%u",&a);
将读取一个十进制数。因此,当您输入1001
时,它将以二进制形式0011 1110 1001
,并且在将此数字转换回十进制后,它将变为 100110。您应该将其读取为字符串以保留二进制形式
然后你写的代码只检查输入值的下 5 位。如果输入1001
它将按"预期"输出9
,因为1001
的较低位是01001
,这对于 9 来说是意外相同的。输出不是您描述的 1001。这意味着上面的代码不是您运行的原始代码。如果输入另一个数字,结果将有所不同。例如,输入 36 将在输出上打印 4
原因很简单,变量"a"是 int 类型,因此当您将输入作为 1001 提供时,它将成为 1001 的整数而不是编译器的二进制文件,因此您将无法获得正确的结果,不要使用 shift 运算符,尝试一些类似于其他人建议的事情
这应该可以帮助您:
#include<stdio.h>
int main()
{
int a,i,p,sum=0;
int temp;
printf("enter binary numbern");
scanf("%d",&a);
for(i = 0 ; i<5; i++) /* Taking only 5 digits in binary */
{
temp=a % 10;
a = a/10;
p = temp<<i;
sum = sum +p;
}
printf("%dn",sum);
return 0;
}
您最好将输入作为字符串,并从该字符串的末尾开始添加 1 位数字的位置值。
%u 将十进制字符串解释为整数,然后尝试将生成的整数值的十进制表示形式解释为二进制。 这不仅令人困惑且有些不合理,还会将您限制为 10 个二进制数字。
考虑一下:
/* binary to integer */
#include <stdio.h>
#include <string.h>
int main()
{
int pv = 1 ;
int value = 0 ;
char bin[33] ;
printf("Enter binary number: ");
scanf("%32s", bin ) ;
for( int i = strlen( bin ) - 1; i >= 0; i-- )
{
if( bin[i] == '1' )
{
value += pv ;
}
pv *= 2 ;
}
printf( "%dn", value ) ;
return 0 ;
}
另请注意,这里发生的事情不是转换为十进制,而是转换为整数。 所有值都以二进制形式存储在内部,如果您选择输出整数值的十进制字符串表示形式,则仅是十进制。
利用整数的内部二进制表示形式的潜在更有效的版本是:
/* binary to integer */
#include <stdio.h>
#include <string.h>
int main()
{
int pv = 1 ;
int value = 0 ;
char bin[33] ;
printf("Enter binary number: ");
scanf("%32s", bin ) ;
for( int i = strlen( bin ) - 1; i >= 0; i-- )
{
if( bin[i] == '1' )
{
value |= pv ;
}
pv <<= 1 ; ;
}
printf( "%dn", value ) ;
return 0 ;
}
这些行是错误的(我认为..):
p = 1<<i;
sum = sum +p;
为了计算十进制值,您必须这样做:
p= pow(2,i);
sum = sum+p;
您需要将 2 提高到 i 的幂。
有关一个很好的示例代码,请参阅此链接:http://www.daniweb.com/software-development/c/threads/307756/binary-to-decimal-conversion-in-c
此代码可用于C++:
string str = "1001";
int temp = 0;
for(int c=0;c<str.length();c++){
int v = atoi( str.substr(c,1).c_str() );
temp=temp+(v*(pow (2, str.length()-c-1)));
}
cout << temp;