3

我正在尝试将长度为“sLength”的位字符串(bitString)转换为 int。以下代码在我的计算机上对我来说很好。有没有可能不起作用的情况?

int toInt(string bitString, int sLength){

    int tempInt;
    int num=0;
    for(int i=0; i<sLength; i++){
        tempInt=bitString[i]-'0';
        num=num+tempInt * pow(2,(sLength-1-i));
    }

    return num;
}

提前致谢

4

6 回答 6

5

pow与双打一起工作。结果可能不准确。改用位算术

num |= (1 << (sLength-1-i)) * tempInt;

不要忘记bitString包含“0”和“1”以外的符号或太长的情况

于 2013-08-08T17:24:49.963 回答
3

或者,您可以让标准库完成繁重的工作:

#include <bitset>
#include <string>
#include <sstream>
#include <climits>

// note the result is always unsigned
unsigned long toInt(std::string const &s) {
    static const std::size_t MaxSize = CHAR_BIT*sizeof(unsigned long);
    if (s.size() > MaxSize) return 0; // handle error or just truncate?

    std::bitset<MaxSize> bits;
    std::istringstream is(s);
    is >> bits;
    return bits.to_ulong();
}
于 2013-08-08T17:46:55.073 回答
2

已经给出的浮点数不准确的回答和通知;不过,这是一个更易读的整数算术实现:

int toInt(const std::string &s)
{
    int n = 0;

    for (int i = 0; i < s.size(); i++) {
        n <<= 1;
        n |= s[i] - '0';
    }

    return n;
}

笔记:

  1. 您不需要明确的长度。这就是为什么我们有std::string::length().

  2. 从零开始计数会产生更简洁的代码,因为您不必每次都进行减法。

于 2013-08-08T17:31:18.540 回答
2

为什么不将您的 for 循环更改为更高效、更简单的 C++11 版本:

for (char c : bitString)
  num = (num << 1) |  // Shift the current set of bits to the left one bit
        (c - '0');    // Add in the current bit via a bitwise-or

顺便说一句,您还应该检查指定的位数是否超出 anint并且您可能希望确保字符串中的每个字符都是 a'0''1'

于 2013-08-08T17:26:05.673 回答
0
for (std::string::reverse_iterator it = bitString.rbegin();
    it != bitString.rend(); ++it) {
    num *= 2;
    num += *it == '1' ? 1 : 0;
}
于 2013-08-08T17:34:31.350 回答
0

我直接看到了三种可能不起作用的情况:

  • pow与 一起使用double,您的结果可能不准确,您可以使用以下方法修复它:

    num |= tempInt * ( 1 << ( sLength - 1 - i ) );
    
  • 如果bitString[i]不是“0”或“1”,

  • 如果您在字符串中的数字大于int限制。

如果您可以控制最后两点,则生成的代码可能是:

int toInt( const string& bitString )
{
    int num = 0;

    for ( char c : bitString )
    {
        num <<= 1;
        num |= ( c - '0' );
    }

    return num;
}

不要忘记const reference作为参数。

于 2013-08-08T17:26:13.020 回答