C ++位字符串转换为int

时间:2013-08-08 17:22:24

标签: c++

我正在尝试将长度为'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;
}

提前致谢

6 个答案:

答案 0 :(得分:4)

pow适用于双打。结果可能不准确。改为使用位算术

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

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

答案 1 :(得分: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();
}

答案 2 :(得分:1)

为什么不将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

顺便说一下,您还应该检查指定的位数是否超过int并且您可能希望确保字符串中的每个字符都是'0'或{{ 1}}。

答案 3 :(得分:1)

回答并注意已经给出的浮点数的不准确性;这里是一个使用整数运算的更具可读性的实现:

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. 从零开始计数会产生更干净的代码,因为您不必每次都进行减法。

答案 4 :(得分:0)

我直接看到三种情况可能无效:

  • powdouble一起使用,您的搜索结果可能不准确,可以通过以下方式修复:

    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作为参数。

答案 5 :(得分:0)

for (std::string::reverse_iterator it = bitString.rbegin();
    it != bitString.rend(); ++it) {
    num *= 2;
    num += *it == '1' ? 1 : 0;
}