Skip to content

Instantly share code, notes, and snippets.

@assyrianic
Last active September 23, 2023 18:17
Show Gist options
  • Save assyrianic/6c4874524d71585abdf409912411885b to your computer and use it in GitHub Desktop.
Save assyrianic/6c4874524d71585abdf409912411885b to your computer and use it in GitHub Desktop.
16-bit integer logarithm
#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