Last active
September 23, 2023 18:17
-
-
Save assyrianic/6c4874524d71585abdf409912411885b to your computer and use it in GitHub Desktop.
16-bit integer logarithm
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <inttypes.h> | |
#include <stdio.h> | |
static inline uint8_t bitwise_ceil8(uint8_t x) { | |
x |= x >> 1; | |
x |= x >> 2; | |
x |= x >> 4; | |
return x; | |
} | |
static inline uint16_t bitwise_ceil16(uint16_t x) { | |
x |= x >> 1; | |
x |= x >> 2; | |
x |= x >> 4; | |
x |= x >> 8; | |
return x; | |
} | |
static inline uint8_t int_log2_8bit(uint8_t const x) { | |
size_t const de_bruijn_tab[/** 8 */] = { | |
0, 5, 1, 6, 4, 3, 2, 7, | |
}; | |
enum { DeBruijnLog2Magic = 0x1Du }; | |
uint8_t const seq = bitwise_ceil8(x) * (uint8_t)DeBruijnLog2Magic; | |
return de_bruijn_tab[seq >> 5]; | |
} | |
static inline uint16_t int_log2_16bit(uint16_t const x) { | |
size_t const de_bruijn_tab[/** 16 */] = { | |
0, 1, 4, 10, 2, 8, 5, 14, | |
11, 3, 7, 9, 6, 12, 11, 15, | |
}; | |
enum { DeBruijnLog2Magic = 0x09AFu }; | |
uint16_t const seq = bitwise_ceil16(x) * (uint16_t)DeBruijnLog2Magic; | |
return de_bruijn_tab[seq >> 12]; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment