How to print __int128 in g++?

前端 未结 6 1754
再見小時候
再見小時候 2020-12-05 06:48

I am using the GCC built-in type __int128 for a few things in my C++ program, nothing really significant, at least not enough to justify to use BigInt library o

6条回答
  •  情深已故
    2020-12-05 07:01

    If it's not performance-critical, here's a simple, readable way to convert a non-negative int128 to a base-10 string (which can then be printed of course):

    std::string toString(__int128 num) {
        std::string str;
        do {
            int digit = num % 10;
            str = std::to_string(digit) + str;
            num = (num - digit) / 10;
        } while (num != 0);
        return str;
    }
    

    We can make this several times faster by getting the digits in larger chunks instead of one at a time. But it requires us to check each chunk for any leading zeroes that have been lost and add them back in:

    std::string toString(__int128 num) {
        auto tenPow18 = 1000000000000000000;
        std::string str;
        do {
            long long digits = num % tenPow18;
            auto digitsStr = std::to_string(digits);
            auto leading0s = (digits != num) ? std::string(18 - digitsStr.length(), '0') : "";
            str = leading0s + digitsStr + str;
            num = (num - digits) / tenPow18;
        } while (num != 0);
        return str;
    }
    

    Note: I've also posted a version of this answer for unsigned int128s here.

提交回复
热议问题