C ++将boost multiprecision int转换为64位长度hex

时间:2016-02-24 13:14:47

标签: c++ boost hex 64-bit

让我们想象一下我们有代码:

boost::multiprecision::mpz_int one(1);

我希望将该值转换为64位(?)十六进制值,结果可能是:

0000000000000000000000000000000000000000000000000000000000000001

我确信这是解决方案,但我不熟悉Boost

实施例: 我有价值:

boost::multiprecision::mpz_int value(8612844778121073626993440829679478604092771119379437256704)

我希望从值

创建64b十六进制

我试过

printf("%064X\n", value);

但不起作用

2 个答案:

答案 0 :(得分:0)

我没有boost可用的atm,但你可以编写一个小函数来为你格式化类型。

如果boost::multiprecision::mpz_int支持bitshift,那么& operator运算符可能是一个解决方案:

template<typename T>
std::string toHex64(const T& value, size_t padding = 1)
{
    using UT = typename std::make_unsigned_t<T>;
    std::string hex;
    UT uvalue = static_cast<UT>(value);
    bool bPositive = std::is_same<T, UT>::value || value == uvalue;
    while (uvalue > UT(0))
    {
        char current = uvalue & 0xF; uvalue >>= 4;
        hex += (current < 0xA) ? (current + '0') : ((current-10) + 'A');
    }
    if (hex.size() < padding)
    {
        if (bPositive)
        {
            hex += std::string(padding - hex.size(), '0');
        }
        else
        {
            hex += std::string(padding - hex.size(), 'F');
        }
    }
    std::reverse(hex.begin(), hex.end());
    return hex;
}

答案 1 :(得分:0)

即使有额外的例子,仍然不清楚你想做什么: a)您是否想要编写整数的二进制表示形式,您可以将其视为由第一个示例建议的64个字符01的字符串? b)或者你想要16字符串的十六进制表示?

如果你的整数不适合64位,你想做什么?

我假设您要打印用零填充的整数的十六进制表示,即(b)。然后解决方案就像(你声称使用c ++)

一样简单
std::cout << std::setfill('0') << std::setw( 16 ) << std::hex << value;

但是,此解决方案未涵盖溢出64位的未指定行为,并且不包括负数。为此你需要更精确......

更新

根据注释,输出应该是64个字符的字符串,可以表示256位整数。这可以通过以下方式完成:

std::cout << std::setfill('0') << std::setw( 64 ) << std::hex << value;