Представлять 128-битное целое число как два 64-битных целых числа в C ++ - PullRequest
0 голосов
/ 11 октября 2018

В моем приложении есть ситуация, когда приложение использует 128-разрядное целое число (в частности, __uint128_t), и в какой-то момент приложение должно кодировать это 128-разрядное целое число как два 64-разрядных целых числа (__uint64_t)).

(Просто предположите ради этого вопроса, что он должен их так кодировать - этот вопрос не об альтернативных способах его кодирования)

Как я могу это сделать?Я должен уметь кодировать и декодировать.

void encode(__uint128_t src, __uint64_t &dest1, __uint64_t &dest2)
{
    // ...
}

void decode(__uint64_t src1, __uint64_t src2, __uint128_t &dest)
{
    // ...
}

Пример использования:

__uint128_t bigIntBefore = 999999999999999999;
__uint64_t smallInt1;
__uint64_t smallInt2;
encode(bigIntBefore, smallInt1, smallInt2);

// ... later

__uint128_t bigIntAfter;
decode(smallInt1, smallInt2, bigIntAfter);
// bigIntAfter should have a value of '999999999999999999'

1 Ответ

0 голосов
/ 11 октября 2018

Хм, почему бы просто не сделать:

void encode(__uint128_t src, __uint64_t &dest1, __uint64_t &dest2)
{
    constexpr const __uint128_t bottom_mask = (__uint128_t{1} << 64) - 1;
    constexpr const __uint128_t top_mask = ~bottom_mask;
    dest1 = src & bottom_mask;
    dest2 = (src & top_mask) >> 64;
}

void decode(__uint64_t src1, __uint64_t src2, __uint128_t &dest)
{
    dest = (__uint128_t{src2} << 64) | src1;
}

?

Конечно, это может быть бесполезно, поскольку __uint128_t может уже иметь только 2 64-битных значения.Кроме того, предпочитайте возвращать значение, а не использовать lvalue-ссылки:

std::pair<__uint64_t,__uint64_t> encode(__uint128_t src)
{
    constexpr const __uint128_t bottom_mask = (__uint128_t{1} << 64) - 1;
    constexpr const __uint128_t top_mask = ~bottom_mask;
    return { src & bottom_mask, (src & top_mask) >> 64 };
}

__uint128_t decode(__uint64_t src1, __uint64_t src2)
{
    return (__uint128_t{src2} << 64) | src1;
}
...