[英]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.