如何从无符号整数(uint16_t
)中获取最有意义的1位索引?
示例:
uint16_t x = // 0000 0000 1111 0000 = 240
printf("ffs=%d", __builtin_ffs(allowed)); // ffs=4
有一个函数(__builtin_ffs
)从无符号整数返回最不重要的1位(LSB)。
我想要相反的,我想要一些函数,它返回8
应用于上面的例子。
备注:我已经尝试构建自己的函数,但我发现数据类型大小存在一些问题,这取决于编译器。
答案 0 :(得分:1)
来自http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Other-Builtins.html的GCC手册:
- 内置函数:int __builtin_clz(unsigned int x)
从最高有效位开始,返回x中前导0位的数量。如果x为0,则结果未定义。
所以,最高设置位:
#define ONE_BASED_INDEX_OF_HIGHEST_SET_BIT(x) \
(CHAR_BIT * sizeof 1 - __builtin_clz(x)) // 1-based index!!
谨防x == 0
或x<0 && sizeof(x)<sizeof 0
。
答案 1 :(得分:0)
如果我正在读这个(我是吗?我对这些东西有点生疏)你可以这样做:
int msb = 0;
while(x) { // while there are still bits
x >>= 1; // right-shift the argument
msb++; // each time we right shift the argument, increment msb
}