Вы можете разбить 57-битное значение на более мелкие порции для выполнения умножений и рекомбинировать в требуемые части, например, 8 + 49 битов:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main() {
#define MASK(n) ((1ULL << (n)) - 1)
uint64_t log2 = MASK(57); // 57 bits
uint16_t absE = MASK(11); // 11 bits
uint32_t m1 = (log2 >> 49) * absE; // middle 19 bits at offset 49;
uint64_t m0 = (log2 & MASK(49)) * absE + ((m1 & MASK(11)) << 49); // low 61 bits
uint16_t result_H = (uint16_t)(m1 >> 11) + (uint16_t)(m0 >> 60); // final high 8 bits
uint64_t result_L = m0 & MASK(60);
printf("%#"PRIx64" * %#"PRIx16" = %#"PRIx16"%012"PRIx64"\n",
log2, absE, result_H, result_L);
return 0;
}
Вывод: 0x1ffffffffffffff * 0x7ff = 0xffdfffffffffff801
Вам может потребоваться больше шагов, если вы не можете использовать 64-битное умножение, используемое для 49-битного на 11-битный шаг.