读取二进制数
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;
}
将二进制数字字符串转换为整数的一个相对简单的方法是:
int result = 0;
for (int index = 0; index < binstr.length(); index++)
{
result *= 2;
result += (binstr[index] - '0');
}
此方法可用于任何基数,将2
替换为 base
,最多 10 个 - 除此之外,您需要将任何其他字符转换为相关的"数字值",然后再将其添加到结果中。
(请注意,上述方法比使用 pow
更有效,并且没有pow
给出的舍入误差的可能性,因为pow
通常以 exp(log(base) * n);
的形式实现,这往往会产生诸如 7.999999
而不是 8 和 16.000001
的 insteaad of 16 这样的答案,当它转换为整数时会导致"有趣"的结果)
[显然,正确的转换需要检查溢出(太多数字)并且数字对于所选的基础是否"有效"]
当你应该朝相反的方向工作时,你似乎在从左到右工作。您在第 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()
库函数是矫枉过正的 - 你可以只使用按位运算符,例如 change:
dec += pow(2, count);
自:
dec += (1 << count);
这避免了不必要的 int-float 转换和数学库调用。
除了上面的评论,您可能希望作业是
dec += pow(2, count);
相反,或者可能
dec = (dec + pow(2, count));
祝你好运!
您正在向后处理二进制字符串 - 第一个数字的值为 1 (20),第二个数字的值为 2 (21),依此类推。
如果要采用此方法,则应向后迭代字符串:
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 += ...
,而不是两者的组合。
相关文章:
- visual在c++中将十进制数转换为二进制数
- 二进制数之和(使用C样式字符串)
- 以 10 c++ 为基数显示 1024 位二进制数
- 二进制数和位标志'x'
- C++ 二进制数到整数值的数组
- 二进制数组中最大连续 1 的起始和结束索引,以 C++ 为单位
- dev如何在C++中比较二进制数
- 递归回溯打印长度为N的二进制数的所有组合,而不使用循环
- 向后打印二进制数
- 如何在 c++ 中将二进制文件读取为字符串
- 使用位黑客反转二进制数
- 以二进制格式读取类
- 添加两个二进制数(整数数组)
- 从 0 到 n 的二进制数,具有相同数量的字符/
- 从二进制文件读取到数组:前面的任意数字
- 从二进制文件 C++ 读取的字符串数组写入
- 将fortran生成的二进制文件读取到C++中的带符号整数数组中
- 通过将结构信息从二进制文件读取到数组中,然后返回到文件C
- 将文件读取为C 的二进制数组
- 读取二进制数