我正在练习C的基本程序,并尝试进行二进制到十进制转换。 下面是我尝试的代码,但它没有产生正确的结果。我无法理解我的逻辑出错的地方。
/* binary to decimal */
#include<stdio.h>
int main()
{
int a,i,p,sum=0;
printf("enter binary number\n");
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("%d\n",sum);
return 0;
}
我输入了1001并且期望9是输出,但输出是1001 ??
答案 0 :(得分:1)
scanf("%u",&a);
将读取十进制数字。因此,当您输入1001
时,它将是0011 1110 1001
二进制文件。因此,将此数字转换回十进制后,它将变为1001 10
您应该将其读作字符串以保留二进制格式
另一个问题是你编写的代码实际上只转换输入值的低5位。因此,如果您输入1001
,它将输出9
,因为1001
的低位是01001
,这对于9而言意外相同。但是如果您输入另一个数字,结果将是与众不同。例如,输入36将在输出上打印4。您应该复制原始代码,而不是重新输入
答案 1 :(得分:0)
这些行是错误的(我认为......):
p = 1<<i;
sum = sum +p;
为了计算小数值,你必须这样做:
p= pow(2,i);
sum = sum+p;
你需要加强2的力量 请参阅此链接以获取一个好示例代码: http://www.daniweb.com/software-development/c/threads/307756/binary-to-decimal-conversion-in-c
答案 2 :(得分:0)
原因非常简单,变量'a'的类型为int,因此当您将输入提供为1001时,它变为1001的整数而不是编译器的二进制,因此您将无法获得正确的结果,请勿使用移位运算符,尝试类似其他人建议的东西
答案 3 :(得分:0)
这可以帮到你:
#include<stdio.h>
int main()
{
int a,i,p,sum=0;
int temp;
printf("enter binary number\n");
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("%d\n",sum);
return 0;
}
答案 4 :(得分:0)
您最好将输入作为字符串,并从该字符串的结尾开始添加1位数的位置值。
%u将 decimal 字符串解释为整数,然后尝试将结果整数值的十进制表示形式解释为二进制。这不仅令人困惑,而且有点不合理,它会将你限制在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( "%d\n", 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( "%d\n", value ) ;
return 0 ;
}
答案 5 :(得分:-1)
此代码可以在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;