c中二进制到十进制

我有一个简单的代码将二进制数转换为十进制数。 在我的编译器中,分解对于小于1000的数字来说效果很好,超出输出总是相同的1023.任何人都有一个想法?

#include  #include  // how many power of ten is there in a number // (I don't use the pow() function to avoid trouble with floating numbers) int residu(int N) { int i=0; while(N>=1){ N=N/10; i++; } return i; } //exponentiating a number a by a number b int power(int a, int b){ int i; int res=1; for (i=0;i<b;i++){res=a*res;} return res; } //converting a number N int main() { int i; //the number to convert int N; scanf("%d",&N); //the final decimal result int res=0; //we decompose N by descending powers of 10, and M is the rest int M=0; for(i=0;i<residu(N);i++){ // simple loop to look if there is a power of (residu(N)-1-i) in N, // if yes we increment the binary decomposition by // power(2,residu(N)-1-i) if(M+ power(10,residu(N)-1-i) <= N) { M = M+power(10,residu(N)-1-i); res=power(2,residu(N)-1-i)+res; } } printf("%d\n",res); } 

是试试这个:

 #include  int main(void) { char bin; int dec = 0; while (bin != '\n') { scanf("%c",&bin); if (bin == '1') dec = dec * 2 + 1; else if (bin == '0') dec *= 2; } printf("%d\n", dec); return 0; } 

这很可能是因为您使用int来存储二进制数。 int不会存储高于2 ^ 31的数字,这是10位数字,而1023是10个二进制数字可以获得的最大数字。

您可以更轻松地将输入数字作为字符串读取,然后处理字符串的每个字符。

经过一些实验,我认为你的程序只能接受一个由1和0组成的数字作为基数为10的数字( %d读取一个十进制数字)。 例如,给定输入10 ,它输出2 ; 给定1010 ,输出10 ; 给定10111001 ,输出185

到现在为止还挺好。 不幸的是,鉴于1234 ,它输出15 ,这有点出乎意料。

如果你在一个int为32位有符号值的机器上运行,那么就不能输入一个超过10位的数字,因为你溢出了32位int的限制(可以处理20亿,圆形的)。 scanf()函数不能很好地处理溢出。

你可以通过回应你的输入来帮助自己; 这是一种标准的调试技术。 确保计算机获得了您期望的价值。

我不会尝试修复代码,因为我认为你是以完全错误的方式解决问题。 (我甚至不确定它是否最好被描述为二进制到十进制,或十进制到二进制,或十进制到二进制到十进制!)你最好将输入读作一串(最多31个)字符,然后validation每个都是0或1.假设这是正确的,那么你可以非常直接地处理字符串以生成一个值,该值可以通过printf()格式化为十进制。

左移是相同而不是乘2并且效率更高,所以我认为这是一个更像c的答案:

 #include  #include  int bin2int(const char *bin) { int i, j; j = sizeof(int)*8; while ( (j--) && ((*bin=='0') || (*bin=='1')) ) { i <<= 1; if ( *bin=='1' ) i++; bin++; } return i; } int main(void) { char* input = NULL; size_t size = 0; while ( getline(&input, &size, stdin) > 0 ) { printf("%i\n", bin2int(input)); } free(input); } 
 #include  //printf #include  //strlen #include  //uintX_t or use int instead - depend on platform. /* reverse string */ char *strrev(char *str){ int end = strlen(str)-1; int start = 0; while( start