如何以二进制形式显示 C++ Boost Library 多精度大整数?

Posted

技术标签:

【中文标题】如何以二进制形式显示 C++ Boost Library 多精度大整数?【英文标题】:How to display C++ Boost Library multi-precision big integers in binary form? 【发布时间】:2020-04-26 03:32:51 【问题描述】:

我是 Boost 新手,正在尝试使用它的多精度库来乘以非常大的输入:

mp::uint1024_t my_1024_bit_int1 = 0b00100101101000100010010...010101;
mp::uint1024_t my_1024_bit_int2 = 0b0010101001000101000010100000001001...01010111; // bigger in practice
mp::uint1024_t my_1024_bit_result = my_1024_bit_int2*my_1024_bit_int1;

我需要能够将结果保存为二进制形式的字符串。我试图访问整数中“肢体”的数量:

int limbs = my_1024_bit_result.backend.limbs();

然后遍历每个肢体并使用bitset函数将每个肢体转换为二进制字符串,但它不起作用。

我还能如何做到这一点?

【问题讨论】:

我相信你想多了。假设您没有使用多精度库——您将如何生成字符串?除了 int 类型将被替换为 cpp_int 之外,这不是完全相同的代码吗? 旁注:你确定你的前 2 行适用于 > 64 位的数字吗? @MarcGlisse 我想它们确实应该是字符串初始化的,但是它们的构造函数不支持0b 格式 【参考方案1】:

如果您实际上是指二进制数字:

template <typename Integer>
std::string to_bin(Integer num) 
    auto sign = num.sign();
    num = abs(num);

    std::string result;
    while (num) 
        result += "01"[int(num % 2)];
        num /= 2;
    
    result += sign<0? "b0-": "b0";
    std::reverse(begin(result), end(result));
    return result;

注意它是如何支持有符号类型的

Live On Coliru

int main() 
    mp::uint1024_t a=0b00100101101000100010010010101;
    mp::uint1024_t b=0b001010100100010100001010000000100101010111; // bigger in practice
    mp::uint1024_t c = a * b;

    std::cout << a << " * " << b << " = " << c << "\n";
    std::cout << "\n" << to_bin(a) << " * " << to_bin(b) << "\n = " << to_bin(c) << "\n";

打印

78922901 * 726187641175 = 57312835311878048675

0b100101101000100010010010101 * 0b1010100100010100001010000000100101010111 = 0b110001101101100000000110000000111101001010111101001000101110100011

序列化?

如果您的意思是“二进制序列化”,请使用序列化:

Writing boost::multiprecision data type to binary file

【讨论】:

我会用右移替换除以 2,但这绝对是正确的方法。

以上是关于如何以二进制形式显示 C++ Boost Library 多精度大整数?的主要内容,如果未能解决你的问题,请参考以下文章

在 Boost Property 树库中,我如何以自定义方式处理文件未找到错误(C++)

有没有办法找出对象的类型(以字节数组形式)C++?

如何在 Boost::wave 库中扩展 token_ids 以接受更多关键字

以二进制形式读取文件,将其压缩并以二进制形式写回

在 boost 中序列化二进制数据失败并出现“无效签名”错误

C++ 查找所有基数,使得这些基数中的 P 以 Q 的十进制表示形式结尾