1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#include <stdint.h> static const unsigned int divtab[244] = { [1] = 0xffff + 1l, [3] = 0x5555 + 1l, [9] = 0x1c71 + 1l, [27] = 0x097b + 1l, [81] = 0x0329 + 1l, [243] = 0x010d + 1l }; #define FASTDIV(n, d) (((n) * divtab[d]) >> 16) #define FASTMOD(n, d) ((n) - (d) * FASTDIV((n), (d))) int new32(int i, int x, int y) { int A, B, C; A = FASTDIV(i, y); B = FASTMOD(A, 3); C = FASTMOD(A + x, 3); return i + (C - B) * y; }