读取二进制数
Reading a binary number
我正在研究一个将二进制数从 std::string
解析为 int
的函数。不知何故,它失败了。
int bin2dec(string &binstr)
{
unsigned int count = 0;
int dec = 0;
while (count < binstr.size()) {
if(binstr[count] == '1') {
dec += (dec + pow(2, count));
}
count++;
}
return dec;
}
您正在反向处理二进制字符串 - 第一个数字的值为 1 (20),第二个数字为 2 (21 ), 等等
如果你想采用这种方法,你应该迭代字符串 backwards:
int dec = 0;
for (int i = binstr.size() - 1; i >= 0; --i) {
if(binstr[count] == '1') {
dec += pow (2, i);
}
count++;
}
注:
正如 PaulR 在评论中指出的那样,您将 dec
添加到自身两次。您应该使用 dec = dec + ...
或 dec += ...
,而不是两者的组合。
当您应该朝相反的方向工作时,您似乎在从左到右工作。您在行 dec += (dec + pow(2, count));
中也有错误,因为您在此处添加了两次 dec
。修复代码的一种可能方法:
int bin2dec(string &binstr)
{
int count = 0;
int dec = 0;
while (count < binstr.size())
{
if (binstr[binstr.size() - index - 1] == '1')
{
dec += pow(2, count); // <<< bug fix here
}
count++;
}
return dec;
}
请注意,使用浮点 pow()
库函数是多余的 - 您可以只使用按位运算符,例如变化:
dec += pow(2, count);
至:
dec += (1 << count);
这避免了不必要的 int-float 转换和数学库调用。
连同上面的评论,您可能希望作业是
dec += pow(2, count);
相反,或者可能
dec = (dec + pow(2, count));
祝你好运!
将二进制数字字符串转换为整数的一种相对简单的方法是:
int result = 0;
for (int index = 0; index < binstr.length(); index++)
{
result *= 2;
result += (binstr[index] - '0');
}
此方法可用于任何基数,将 2
替换为 base
,最多 10 个 - 超出此范围,您需要将使用的任何其他字符转换为相关的 "digit-value" 在将其添加到结果之前。
(请注意,上面的方法比使用 pow
更有效,并且没有 pow
给出的舍入误差的可能性,因为 pow
通常被实现为exp(log(base) * n);
,它往往会得出诸如 7.999999
而不是 8 和 16.000001
而不是 16 之类的答案,当它转换为整数时会导致 "interesting" 结果)
[显然,正确的转换需要检查溢出(位数太多),并且对于所选的基数,位数是 "valid"]
我正在研究一个将二进制数从 std::string
解析为 int
的函数。不知何故,它失败了。
int bin2dec(string &binstr)
{
unsigned int count = 0;
int dec = 0;
while (count < binstr.size()) {
if(binstr[count] == '1') {
dec += (dec + pow(2, count));
}
count++;
}
return dec;
}
您正在反向处理二进制字符串 - 第一个数字的值为 1 (20),第二个数字为 2 (21 ), 等等
如果你想采用这种方法,你应该迭代字符串 backwards:
int dec = 0;
for (int i = binstr.size() - 1; i >= 0; --i) {
if(binstr[count] == '1') {
dec += pow (2, i);
}
count++;
}
注:
正如 PaulR 在评论中指出的那样,您将 dec
添加到自身两次。您应该使用 dec = dec + ...
或 dec += ...
,而不是两者的组合。
当您应该朝相反的方向工作时,您似乎在从左到右工作。您在行 dec += (dec + pow(2, count));
中也有错误,因为您在此处添加了两次 dec
。修复代码的一种可能方法:
int bin2dec(string &binstr)
{
int count = 0;
int dec = 0;
while (count < binstr.size())
{
if (binstr[binstr.size() - index - 1] == '1')
{
dec += pow(2, count); // <<< bug fix here
}
count++;
}
return dec;
}
请注意,使用浮点 pow()
库函数是多余的 - 您可以只使用按位运算符,例如变化:
dec += pow(2, count);
至:
dec += (1 << count);
这避免了不必要的 int-float 转换和数学库调用。
连同上面的评论,您可能希望作业是
dec += pow(2, count);
相反,或者可能
dec = (dec + pow(2, count));
祝你好运!
将二进制数字字符串转换为整数的一种相对简单的方法是:
int result = 0;
for (int index = 0; index < binstr.length(); index++)
{
result *= 2;
result += (binstr[index] - '0');
}
此方法可用于任何基数,将 2
替换为 base
,最多 10 个 - 超出此范围,您需要将使用的任何其他字符转换为相关的 "digit-value" 在将其添加到结果之前。
(请注意,上面的方法比使用 pow
更有效,并且没有 pow
给出的舍入误差的可能性,因为 pow
通常被实现为exp(log(base) * n);
,它往往会得出诸如 7.999999
而不是 8 和 16.000001
而不是 16 之类的答案,当它转换为整数时会导致 "interesting" 结果)
[显然,正确的转换需要检查溢出(位数太多),并且对于所选的基数,位数是 "valid"]