我想将二进制的字符串转换为小数。
以下是fullCard值。
fullCard = "1000000100000101111101"
以下是转换为十进制后的样子
fullCardInt = 2113917
Main.ino
String fullCard; // binary value full card number
int fullCardInt = bin2dec(const_cast<char*>(fullCard.c_str()));
// I get -1 which is a failure.
serial.print(fullCardInt);
int bin2dec(const char *bin)
{
int result=0;
for(;*bin;bin++)
{
if((*bin!='0')&&(*bin!='1'))
return -1;
result=result*2+(*bin-'0');
if(result<=0) return -1;
}
return result;
}
答案 0 :(得分:4)
1000000100000101111101
有22位。
int
是16位。
解决方案是使用long
(32位)而不是int
。
答案 1 :(得分:3)
因为这个功能是便携式的,你测试过吗?你有没有检查它是怎么回事?我们不是在这里进行代码审查,也不是调试代码。
#include <stdio.h>
int bin2dec(const char *bin)
{
int result=0;
for(;*bin;bin++)
{
if((*bin!='0')&&(*bin!='1'))
return -1;
result=result*2+(*bin-'0');
if(result<=0) return -1;
}
return result;
}
int main ( void )
{
printf("%d\n",bin2dec("1000000100000101111101"));
return(0);
}
结果我得到了2113917。
你的代码可以使用几个快捷方式,但功能上它是合理的。你没有告诉我们你是怎么称呼它的。
啊,是的,加上一个gre_gor的答案就是问题。
#include <stdio.h>
short bin2dec(const char *bin)
{
short result=0;
for(;*bin;bin++)
{
if((*bin!='0')&&(*bin!='1'))
return -1;
result=result*2+(*bin-'0');
if(result<=0) return -1;
}
return result;
}
int main ( void )
{
printf("%d\n",bin2dec("1000000100000101111101"));
return(0);
}
结果为-1,因为你有这一行
if(result<=0) return -1;
将你的大小限制为int - 1位。所以15为16位int,31为32位。
#include <stdio.h>
short bin2dec(const char *bin)
{
short result=0;
for(;*bin;bin++)
{
if((*bin!='0')&&(*bin!='1'))
{
printf("here\n");
return -1;
}
result=result*2+(*bin-'0');
printf("0x%04X\n",result);
if(result<=0)
{
printf("there\n");
return -1;
}
}
return result;
}
int main ( void )
{
printf("%d\n",bin2dec("1000000100000101111101"));
return(0);
}
0x0001
0x0002
0x0004
0x0008
0x0010
0x0020
0x0040
0x0081
0x0102
0x0204
0x0408
0x0810
0x1020
0x2041
0x4082
0xFFFF8105
there
-1
记住,加上一个/接受gre_gor的答案不是我的......