C++:二进制std::string转十进制

6
我想将64位二进制字符串转换为64位整数(无符号)。在C++中是否有任何库函数可以实现这一点?
编辑:
我使用:
main()
{
std::string st = "010111000010010011000100010001110110011010110001010111010010010110100101011001010110010101101010" ;

uint64_t number;
number = strtoull (st.c_str (),NULL,2);
cout << number << " " ;

char ch = std::cin.get();
cout << ch ;


   return 0;
}

什么是“二进制字符串”?是指包含字符'0'和'1'的字符串吗? - Jerry Coffin
5
你有96个比特。这比大多数C++实现支持的任何整数类型都要大。 - nos
可能是重复的问题:如何在C++中将数字转换为字符串,反之亦然 - Kate Gregory
5个回答

12

你可以使用 strtoull() 函数并指定基数为2(如果你按照链接中的示例进行操作,就会看到这个功能)。


假设unsigned long long的大小为64位,这是很可能的。 - Gorpik
@Gorpik 这是C/C++标准库可以解析数字的最大整数类型。 - Maxim Egorushkin
@alessandro 请发布代码,这样我们就可以看到您是如何做的。 - Maxim Egorushkin
@alessandro 你需要比“错误输出”更具体的信息。Maxim: 的确如此。我只是想明确一下,答案并不普遍适用于所有平台,它取决于平台。 - Gorpik
我在帖子中提供了代码。错误的输出意味着输出值不是应该的值(使用一些二进制转换器找到)。 - alessandro

10
如果你使用的是C++11,你可以例如使用std::bitset
#include <iostream>
#include <bitset>

int main()
{
    const std::string s = "0010111100011100011";
    unsigned long long value = std::bitset<64>(s).to_ullong();
    std::cout << value << std::endl;
}

或者std::stoull

#include <iostream>
#include <string>

int main()
{
    const std::string s = "0010111100011100011";
    unsigned long long value = std::stoull(s, 0, 2);
    std::cout << value << std::endl;
}

1
以下代码可能是将二进制字符串转换为其整数值的最简单方法。不使用biteset或boost,这适用于任何长度的二进制字符串。
std::string binaryString = "10101010";  
int value = 0;
int indexCounter = 0;
for(int i=binaryString.length()-1;i>=0;i--){

    if(binaryString[i]=='1'){
        value += pow(2, indexCounter);
    }
    indexCounter++;
}

0

将二进制字符串转换为整数和二进制字符串(最多64位)转换为长整型。使用位移操作,因此比pow()函数稍微更有效率。

#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;

string getBinaryString(int value, unsigned int length, bool reverse) {
    string output = string(length, '0');
    if (!reverse) {
        for (unsigned int i = 0; i < length; i++) {
            if ((value & (1 << i)) != 0) {
                output[i] = '1';
            }
        }
    }
    else {
        for (unsigned int i = 0; i < length; i++) {
            if ((value & (1 << (length - i - 1))) != 0) {
                output[i] = '1';
            }
        }
    }
    return output;
}

unsigned long getInteger(const string& input, size_t lsbindex, size_t msbindex) {
    unsigned long val = 0;
    unsigned int offset = 0;
    if (lsbindex > msbindex) {
        size_t length = lsbindex - msbindex;
        for (size_t i = msbindex; i <= lsbindex; i++, offset++) {
            if (input[i] == '1') {
                val |= (1 << (length - offset));
            }
        }
    }
    else { //lsbindex < msbindex
        for (size_t i = lsbindex; i <= msbindex; i++, offset++) {
            if (input[i] == '1') {
                val |= (1 << offset);
            }
        }
    }
    return val;
}

int main() {
    int value = 23;
    cout << value << ": " << getBinaryString(value, 5, false) << endl;
    string str = "01011";
    cout << str << ": " << getInteger(str, 1, 3) << endl;
}

-1
你可以尝试这个。如果你不需要它是通用的,你可以指定类型并且不使用Number:
template <typename Number>
Number process_data( const std::string& binary )
{
    const Number * data_ptr;
    Number data;

    data_ptr = reinterpret_cast<const Number*>(binary.data());
    data = *data_ptr;

    return data;
}

上述假设使用 std::string 保存二进制数据,这并不理想。人们通常使用 std::vector<char> 来保存二进制数据,而使用 std::string 来保存文本数据。 - Maxim Egorushkin
它可能可以工作,但它无法通过代码审查。在std::string中传递二进制数据最多只会引起混淆。你不会将int传递为void,对吧? - Maxim Egorushkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接