将字符串二进制(64位)转换为十进制(iphone中的c ++)的问题

时间:2010-03-09 22:22:05

标签: c++ iphone binary decimal

我在将字符串二进制转换为十进制

时遇到问题

我正在使用bitset

bitstring ="1011010001111111";

unsigned long binToDec( string bitstring){
    bitset<32> dec (bitstring);
    return dec.to_ulong();
}

所有这一切都很好,但!!当我尝试用更多32位的位字符串做同样的事情时,问题就来了。我知道bitset只用4个字节进行转换,但我需要用48或56位的字符串进行转换(有时我需要得到14或15位)

string bitstring;
bitstring ="11100101001001000000100000100100110100110011010001111111";
i want to get this number: 64497387062899840

任何消化?任何人都有将二进制字符串转换为十进制的函数吗?

注意:我不能使用boost,因为它没有移植到iphone。

感谢您的帮助

4 个答案:

答案 0 :(得分:2)

每当你越过ULONG_MAX时,你可能会遇到溢出。使用更大的数据类型,例如unsigned long long。但是,如果您的数字可能大于此类型可以容纳的最大数量,那么您可能需要实现一个bignum库。

遵循cube的建议,vanilla C代码:

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h> 

uint64_t binToDec(const char * s){
        uint64_t res = 0; size_t i, n;
        for (i = 0, n = strlen(s) - 1; i < n; ++i) {
                 res = (res | (unsigned int)(s[ i ] - '0')) << 1;
        }
        return res;
}

int main() {
   /* Note the special C99 format specifier macros defined in <inttypes.h> */
   printf("%"PRIu64"\n", 
     binToDec("11100101001001000000100000100100110100110011010001111111"));
}

注意:ISO C ++不支持long long

答案 1 :(得分:1)

最简单的答案是将你的字符串切成两半,将其转换为一对32位的整数,然后将它们打包在一起。

答案 2 :(得分:1)

这应该可以解决问题,但未经测试。

unsigned long binToDec(const std::string& s)
{
  unsigned long d = 0;
  for (int i = 0; i < s.size(); ++i)
  {
    d <<= 1;
    if (s[i] == '1')
      ++d;
  }
  return d;
}

答案 3 :(得分:1)

我刚刚将这个放在一起,它似乎适用于你的例子,我没有测试任何更大的值,将结果与计算器进行比较。

输出:

64497387062899839

代码:

#include <iostream>
#include <limits>

using namespace std;

unsigned long long convert(string& bits)
{
    if (bits.length() > (size_t)numeric_limits<unsigned long long>::digits)
        return 0;

    unsigned long long sum = 0;
    unsigned long long shift = 1;
    for (string::reverse_iterator it(bits.rbegin()), end(bits.rend());
         it < end; ++it)
    {
        if (*it == '1') sum += shift;
        shift = (shift << 1);
    }

    return sum;
}

int main()
{
    string bits("11100101001001000000100000100100110100110011010001111111");
    cout << "returned: " << convert(bits) << endl;
}