簡體   English   中英

問題將字符串二進制(64位)轉換為十進制(iPhone中的C ++)

[英]Problem to convert string binary (64 bits) to decimal (c++ in iphone)

我在將字符串二進制轉換為十進制時遇到問題

我正在使用位集

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。

謝謝你的幫助

每當您穿過ULONG_MAX時,您可能都會遇到溢出問題。 使用更大的數據類型,例如unsigned long long 但是,如果您的數字可以大於此類型可以容納的最大值,則您可能正在考慮必須實現bignum庫。

按照多維數據集的建議,使用香草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

最簡單的答案是將您的字符串切成兩半,將其轉換為一對32位整數,然后將它們打包在一起。

這應該可以解決問題,但未經測試。

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;
}

我將其放在一起,它似乎可以與您的示例一起使用,我還沒有測試任何更大的值(將結果與計算器進行比較)。

輸出:

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM