Проблема преобразования двоичной строки (64 бита) в десятичную (c ++ в iphone) - PullRequest
5 голосов
/ 10 марта 2010

У меня проблема с преобразованием двоичной строки в десятичную

Я использовал битсет

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 ]

2 голосов
/ 10 марта 2010

Вероятно, вы переходите в переполнение всякий раз, когда пересекаете ULONG_MAX. Используйте больший тип данных, такой как unsigned long long. Однако, если ваше число может быть больше, чем максимальное, которое может содержать этот тип, вы, вероятно, пытаетесь реализовать библиотеку bignum.

Следуя совету cube , ванильный код 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 голос
/ 10 марта 2010

Я только что собрал это, и, похоже, это работает с вашим примером, я не проверял никаких больших значений, сравнивая результат с калькулятором.

Выходы:

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;
}
1 голос
/ 10 марта 2010

Это должно сработать, но не проверено.

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;
}
1 голос
/ 10 марта 2010

Самый простой ответ - разрезать строку пополам, преобразовать ее в пару 32-битных целых, а затем собрать их вместе.

...