|
|
|
|
|
by mananaysiempre
678 days ago
|
|
static int64_t read_sprefix(unsigned char **buf) {
uint64_t x = *(uint64_t *)*buf;
unsigned n = stdc_trailing_zeros(x) + 1;
assert(n <= 8); /* handles values up to 2**56 - 1 */
*buf += n;
return (int64_t)(x << 64 - 8*n) >> 64 - 7*n;
}
Seems pretty OK too and doesn’t force a branch per byte. (Imagine a memcpy instead of the first line if the strict-aliasing UB annoys you.) I guess it does do somewhat more work if the majority of the inputs fits in a byte. |
|