C中的MSB(最左边1位)索引

时间:2014-12-10 04:17:10

标签: c

如何从无符号整数(uint16_t)中获取最有意义的1位索引?

示例:

uint16_t x = // 0000 0000 1111 0000 = 240
printf("ffs=%d", __builtin_ffs(allowed)); // ffs=4

有一个函数(__builtin_ffs)从无符号整数返回最不重要的1位(LSB)。

我想要相反的,我想要一些函数,它返回8应用于上面的例子。

备注:我已经尝试构建自己的函数,但我发现数据类型大小存在一些问题,这取决于编译器。

2 个答案:

答案 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 == 0x<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
}