这是有效的,但这是一个沉重的解决方案
#define COUNT_BITS_4b(Val) \
((Val) & 0x1) + (((Val) >> 1) & 0x1) + (((Val) >> 2) & 0x1) + (((Val) >> 3) & 0x1)
#define COUNT_BITS_8b(Val) \
(COUNT_BITS_4b(Val) + COUNT_BITS_4b(Val >> 4))
#define COUNT_BITS_16b(Val) \
(COUNT_BITS_8b(Val) + COUNT_BITS_8b(Val >> 8))
#define COUNT_BITS_32b(Val) \
(COUNT_BITS_16b(Val) + COUNT_BITS_16b(Val >> 16))
#define COUNT_BITS_32b(Val) \
(COUNT_BITS_16b(Val) + COUNT_BITS_16b((Val >> 31) >> 1))
....
我想摆脱这一部分,(用类似的东西替换#define ULONG_BIT
评估( (COUNT_BITS(ULONG_MAX))
)
#if COUNT_BITS_128b(ULONG_MAX) == 32
#define ULONG_BIT 32
#elif COUNT_BITS_128b(ULONG_MAX) == 33
#define ULONG_BIT 33
#elif COUNT_BITS_128b(ULONG_MAX) == 34
#define ULONG_BIT 34
....
#elif COUNT_BITS_128b(ULONG_MAX) == 128
#define ULONG_BIT 128
#endif
任何答案的答案。
答案 0 :(得分:0)
如果你真的在寻找一种方法,在预处理时将其解析为十进制值,这样就可以解决这个问题:
#define NEKO_4294967295 32
... for all the values up to 128 ...
... for all possible variants with U or UL appended ...
#define NEKO_TESTER(VAL) NEKO_ ## VAL
#define ULONG_BITS NEKO_TESTER(ULONG_MAX)
虽然从技术上讲,不能保证ULONG_MAX
可以解析为一个简单的十进制常量。