Проблема для преобразования строкового двоичного файла (64 бита) в десятичное число (C++ в iPhone)

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

Я использовал 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

Какое-либо предложение? у кого-либо есть функция для преобразования двоичной строки к десятичному числу?

Примечание: я не могу использовать повышение, потому что оно не портировано к iPhone.

Спасибо за помощь

5
задан 4 revs, 2 users 100% 9 March 2010 в 23:37
поделиться

4 ответа

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

Выходы:

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
ответ дан 14 December 2019 в 19:10
поделиться

Вы, вероятно, сталкиваетесь с переполнением, когда пересекаете 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 .

2
ответ дан 14 December 2019 в 19:10
поделиться

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

1
ответ дан 14 December 2019 в 19:10
поделиться

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

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
ответ дан 14 December 2019 в 19:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: