簡體   English   中英

C ++將boost multiprecision int轉換為64位長的十六進制

[英]C++ convert boost multiprecision int to 64 bit length hex

假設我們有代碼:

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

並且我想將該值轉換為64位(?)十六進制值,因此結果可能是:

0000000000000000000000000000000000000000000000000000000000000001

我確定這是解決方案,但我對Boost並不熟悉

示例:我有價值:

boost::multiprecision::mpz_int value(8612844778121073626993440829679478604092771119379437256704)

我想從價值創造64b十六進制,

我試過了

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

但是不工作

我沒有可用的boost提款機,但是您可以編寫一個小的函數來為您設置類型的格式。

如果boost::multiprecision::mpz_int支持boost::multiprecision::mpz_int並且& 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;
}

即使有額外的示例,仍不清楚要做什么:a)是否要編寫整數的二進制表示形式,如您的第一個示例所建議的那樣,您可以將其視為64個字符的字符串( 01 b)還是您希望使用十六進制表示形式的十六進制字符串?

如果您的整數不適合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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM