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

C中的MSB(最左1位)索引,c,C,如何从无符号整数(uint16\t)中获取最有意义的1位索引 例如: uint16_t x = // 0000 0000 1111 0000 = 240 printf("ffs=%d", __builtin_ffs(allowed)); // ffs=4 有一个函数(\u builtin\u ffs)从无符号整数返回最低有效1位(LSB) 我想要一些相反的东西,我想要一些返回8的函数,应用于上面的例子 备注:我尝试构建自己的函数,但发现数据类型大小存在一些问题,这取决于编译器。来自GCC手册,

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

例如:

uint16_t x = // 0000 0000 1111 0000 = 240
printf("ffs=%d", __builtin_ffs(allowed)); // ffs=4
有一个函数(
\u builtin\u ffs
)从无符号整数返回最低有效1位(LSB)

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

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

来自GCC手册,网址为:

  • 内置函数:int\uu内置函数(无符号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如果我读对了(是吗?我对这些东西有点生疏),你可以按如下方式执行:

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
}

CHAT\u BIT
是什么意思?@Israel是
char
(字节)中的位数-现在,通常是8。由于
\uuuuuu builtin\u clz()
接受一个无符号的int参数,我认为应该是
char\u BIT*sizeof int-\uuu builtin\u clz(x)
,因为
x
将被提升为int。还要注意缺少“-1”因为OP从1开始对位进行编号,并希望他的示例返回8。位编号应始终从零开始。很少有地方是从1开始的。所以你的例子应该返回7。我同意@JonathonReinhart,因为让位n代表2^n是有意义的。也就是说,我的回答与你的例子一致。可能重复的
x>>1无效。我编辑了你的答案以达到你的目的。然而,我相信这仍然会产生一个与之相去甚远的答案。@JonathonReinhart感谢您的更正。至于一个一个的,你确定吗?0返回0,1返回1,2(0x10)或3(0x11)返回2,等等。
测试值:0x0000F00D\uuuu内置clz:16重复数据消除程序:15 RobP:16
对重复数据消除程序的回答发表评论:还要注意缺少“-1”,因为OP数字位从1开始,希望他的示例返回8。啊,我想你在技术上是正确的。删除了我的否决票,因为现在离这更近了。