我正在尝试将长度为'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;
}
提前致谢
答案 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;
}
注意:
您不需要明确的长度。这就是为什么我们有std::string::length()
。
从零开始计数会产生更干净的代码,因为您不必每次都进行减法。
答案 4 :(得分: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
作为参数。
答案 5 :(得分:0)
for (std::string::reverse_iterator it = bitString.rbegin();
it != bitString.rend(); ++it) {
num *= 2;
num += *it == '1' ? 1 : 0;
}