2016-02-24 2 views
0

позволяет предположить, что у нас есть код:C++ преобразовать наддува multiprecision Int в длину 64 разрядном шестнадцатеричном

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

, и я хотел бы преобразовать это значение в 64 бит шестнадцатиричное значение, так что результат может быть (?):

0000000000000000000000000000000000000000000000000000000000000001 

Я уверен, что это решение, что, но я не знаком с Boost,

Пример: у меня есть значение:

boost::multiprecision::mpz_int value(8612844778121073626993440829679478604092771119379437256704) 

и я хочу создать 64b шестигранник от значения,

Я попытался

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

но не работают

+1

В чем проблема? – Logicrat

+0

@Logicrat, как это сделать :). В этом примере у меня есть переменная с «1» значением, но она может быть намного больше. – Robert

+0

@Robert Возможно, вы хотите добавить еще несколько примеров, поскольку в настоящее время никто не знает, в чем проблема. –

ответ

0

Я не boost доступных атм, но вы можете написать маленькая функция, которая форматирует тип для вас.

Если 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; 
} 
0

Даже с дополнительным примера остается неясным, что вы хотите сделать: а) Вы хотите записать бинарный файл представление целого числа, которое вы можете представить как строку из 64 символов 0 или 1, как показывает ваш первый пример? b) Или вы хотите, чтобы шестнадцатеричное представление представляло собой 16-символьную строку?

Что вы хотите сделать, если ваше целое не вписывается в 64 бит?

Я предполагаю, что вы хотите напечатать шестнадцатеричное представление целого числа, заполненного нулями, то есть (b). Тогда решение так же легко, как (вы утверждаете использовать C++)

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

Однако это решение не распространяется на неопределенное поведение перелива 64 бит и не покрывает отрицательные числа. Для этого вам нужно быть более точным ...


Update:

Согласно комментария вывод должен быть строка 64 символов, которые могут представлять собой 256 битное целое число. Это может быть выполнено с помощью:

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

Я хочу преобразовать свое «значение» в эквивалент std :: printf («% 064x», значение); – Robert

 Смежные вопросы

  • Нет связанных вопросов^_^