If the only thing missing is support for unsigned 128-bit integers, here's the solution:
#include <stdio.h> #include <inttypes.h> typedef struct { uint32_t v3, v2, v1, v0; } uint128; static void uint128_divmod(uint128 *out_div, uint32_t *out_mod, const uint128 *in_num, uint32_t in_den) { uint64_t x = 0; x = (x << 32) + in_num->v3; out_div->v3 = x / in_den; x %= in_den; x = (x << 32) + in_num->v2; out_div->v2 = x / in_den; x %= in_den; x = (x << 32) + in_num->v1; out_div->v1 = x / in_den; x %= in_den; x = (x << 32) + in_num->v0; out_div->v0 = x / in_den; x %= in_den; *out_mod = x; } int main(void) { uint128 x = { 0x12345678, 0x12345678, 0x12345678, 0x12345678 }; uint128 result; uint32_t mod; uint128_divmod(&result, &mod, &x, 16); fprintf(stdout, "%08"PRIx32" %08"PRIx32" %08"PRIx32" %08"PRIx32" rest %08"PRIx32"\n", result.v3, result.v2, result.v1, result.v0, mod); return 0; }
With this function, you can repeatedly calculate the result of mod-36, which leads you to a number encoded as base-36.
Rolling illig
source share