-3

I was practicing basic programs of C and tried to do a binary to decimal conversion.

Below is the code I tried but it did not produce correct results. I couldn't understand where my logic goes wrong.

/*     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;
}

I entered 1001 and was expecting 9 to be the output, but output was 1001?

4

6 回答 6

1

scanf("%u",&a);将读取一个十进制数。因此,当您输入1001时,它将是0011 1110 1001二进制的,在您将此数字转换回十进制后,它变为 1001 10。您应该将其作为字符串读取以保留二进制形式

然后您编写的代码仅检查输入值的低 5 位。如果您输入1001,它将输出为“预期”,因为is的9低位意外与 9 相同。输出不是您描述的 1001 。这意味着上面的代码不是您运行的原始代码。如果您输入另一个数字,结果会有所不同。例如输入 36 将在输出中打印 4100101001

于 2013-10-20T14:58:02.443 回答
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;
 }
于 2013-10-20T14:15:38.910 回答
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

于 2013-10-20T13:51:06.403 回答
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( "%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 ;
}
于 2013-10-20T16:19:09.257 回答
0

原因很简单,变量 'a' 是 int 类型,因此当您将输入提供为 1001 时,它变成 1001 的整数,而不是编译器的二进制,所以您不会得到正确的结果,不要使用移位运算符,尝试一些类似于其他人建议的事情

于 2013-10-20T14:01:14.440 回答
-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;
于 2013-10-20T13:51:57.240 回答