1

私は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関数を使用して各リムをバイナリ文字列に変換しますが、機能しませんでした。

他にどうすればこれを達成できますか?

4

1 に答える 1

1

実際に 2 進数を意味する場合:

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

署名された型もサポートする方法に注意してください

ライブ・オン・コリル

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

0b10010110100010010010010101 * 0b1010100100100010100001010000000100101010111 = 0b11000110110110110000000000100000001111010010101011010010010001110100011

シリアライズ?

「バイナリ シリアライゼーション」を意味する場合は、シリアライゼーションを使用します。

于 2020-04-26T16:19:49.047 に答える