我有一个简单的代码将二进制数转换为十进制数。在我的编译器中,分解对于小于1000的数字来说效果很好,超出输出总是相同的1023.任何人都有一个想法?
#include <stdio.h>
#include <stdlib.h>
// 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);
}
答案 0 :(得分:8)
是的,试试这个:
#include <stdio.h>
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;
}
答案 1 :(得分:3)
这很可能是因为您使用int
来存储二进制数。 int
不会存储2 ^ 31以上的数字,长度为10位数,而1023是10位二进制数字可以得到的最大数字。
您可以更轻松地将输入数字作为字符串读取,然后处理字符串的每个字符。
答案 2 :(得分:1)
经过一些实验,我认为你的程序只能接受一个由1和0组成的数字作为基数为10的数字(%d
读取一个十进制数字)。例如,给定输入10
,它输出2
;给定1010
,输出10
;给定10111001
,它会输出185
。
到目前为止,这么好。不幸的是,给定1234
,它会输出15
,这有点出乎意料。
如果您在int
是32位有符号值的计算机上运行,则无法输入超过10位数的数字,因为您超出了32位{{ 1}}(以圆形方式处理±20亿)。 int
函数不能很好地处理溢出。
你可以通过回应你的输入来帮助自己;这是一种标准的调试技术。确保计算机获得了您期望的价值。
我不会尝试修复代码,因为我认为你是以完全错误的方式解决问题。 (我甚至不确定它是否最好被描述为二进制到十进制,或十进制到二进制,或十进制到二进制到十进制!)您最好将输入读取为(最多31个)字符的字符串,然后验证每个都是0或1.假设这是正确的,那么你可以非常直接地处理字符串以生成一个值,该值可以由scanf()
格式化为十进制。
答案 3 :(得分:0)
向左移动与乘以2相同并且效率更高,所以我认为这是一个更像c的答案:
#include <stdio.h>
#include <stdlib.h>
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);
}
答案 4 :(得分:0)
#include <stdio.h> //printf
#include <string.h> //strlen
#include <stdint.h> //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<end ){
str[start] ^= str[end];
str[end] ^= str[start];
str[start] ^= str[end];
++start;
--end;
}
return str;
}
/* transform binary string to integer */
uint32_t binstr2int(char *bs){
uint32_t ret = 0;
uint32_t val = 1;
while(*bs){
if (*bs++ == '1') ret = ret + val;
val = val*2;
}
return ret;
}
int main(void){
char binstr[] = "1010101001010101110100010011111"; //1428875423
printf("Binary: %s, Int: %d\n", binstr, binstr2int(strrev(binstr)));
return 0;
}