C/C++求出最低比特位的位置的宏

#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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章