#define HASLOWBITS(x, y) ((x) & ((1ULL << (y)) - 1))
#define CONDSHR(x, y) (HASLOWBITS(x, y) ? (x) : (x) >> (y))
#define CONDADD(x, y) (HASLOWBITS(x, y) ? 0 : (y))
#define CONDSHR32(x) CONDSHR(x, 32)
#define CONDSHR48(x) CONDSHR(CONDSHR32(x), 16)
#define CONDSHR56(x) CONDSHR(CONDSHR48(x), 8)
#define CONDSHR60(x) CONDSHR(CONDSHR56(x), 4)
#define CONDSHR62(x) CONDSHR(CONDSHR60(x), 2)
#define CONDADD32(x) CONDADD(x, 32)
#define CONDADD48(x) CONDADD32(x) + CONDADD(CONDSHR32(x), 16)
#define CONDADD56(x) CONDADD48(x) + CONDADD(CONDSHR48(x), 8)
#define CONDADD60(x) CONDADD56(x) + CONDADD(CONDSHR56(x), 4)
#define CONDADD62(x) CONDADD60(x) + CONDADD(CONDSHR60(x), 2)
#define CONDADD63(x) CONDADD62(x) + CONDADD(CONDSHR62(x), 1)
// FIRSTSIGN(x) unfold to the position of the lowest bit of x
#define FIRSTSIGN(x) (x ? CONDADD63((uint64_t)x) : 64)
FIRSTSIGN(x)
的值会被展开为x的最低比特位的位置,最高支持64位整数,若x
为0,则展开为64.
宏定义中使用了uint64_t
类型,因此需要包含头文件。
C头文件:
#include <stdint.h>
C++头文件:
#include <cstdint>