从二进制字符串转换为十进制?
在下面的代码中,我将一个二进制转换为十进制,然后打印对应的字符。从二进制字符串转换为十进制?
void convertToChar(int binaryChar[],int length)
{
int multiplier = 0;
int i;
int sum = 0;
for(i=length;i>=0;i++)
{
sum = sum + (binaryChar[i]*pow(2,multiplier));
multiplier = multiplier + 1;
}
printf("\nThe character is: %c",sum);
}
的问题是在该行sum = sum + (binaryChar[i]*pow(2,multiplier));
。它引发错误:从double'
。请帮助warning: converting to
INT”!
你为什么用pow
来计算2的幂次?这太慢了。使用1 << p
获得两个p的幂。例如,1 << 0
会给1,1 << 1
会给2,1 << 2
会给4.这是由于比特移位操作的性质:一个比特左移相当于由2
另外相乘的,它看起来就像你在你的程序有一个无休止的循环:
for(i=length;i>=0;i++)
如果length
为> = 0,则循环永远不会终止。
这应该修复它:
for(i = length - 1; i>=0; i--) sum += (binaryChar[i]*(1 << multiplier++));
实际上,循环**将**终止,但仅限于之后int类型已经绕到负数,在此之前该程序可能会打到无效的内存访问。:) – snap
的pow
的签名是:
double pow(double X, double Y);
计算2 ^乘数使用:
1 << multiplier;
就迅速提:
- 你有一个无限循环
- 如果你从另一个方向解析字符串哟你可以乘以两,所以你不需要
multiplier
变量。 - 之后,很多问题,我甚至不知道
int binaryChar[]
是正确的。字符中的字母表示不同的类型(和代码)。
。
不幸的是,这只是代码的许多问题之一 –
pow需要双打,并返回一倍。一个丑陋的解决方法是只使用强制
(int)pow(x, y)
但在这个简单的程序,为什么不只是做自己的力量扩张,而不是调用战俘的?
的问题是,数据类型为INT的精度是作为双(函数pow返回双)因此binaryChar的值的精确度更小的[I]将是implizit转换为double ...等问题的行隐含如下所示:
sum = (double) sum + ((double) binaryChar[i] * pow((double)2, (double) multiplier))
为了摆脱你必须做一个明确的转换( 见Type Conversion)警告,例如:从双为int你的电话号码转换
sum = sum + (binaryChar[i] * ((int) pow(2, multiplier));
时可以被截断(使用同一类型 - >用双) – cristian
你从二进制字符串(如“1010101”)转换,对吧?我在问题标题中添加了“字符串”,因为这更好地描述了你想要做的事情。虽然实际上从二进制字符串转换为二进制。 –
我不是从double转换为int我所有的数据类型都是整数 – station