bit-manipulation - 清除除最重要的一位以外的所有内容
问题描述
对于无符号整数j
,该操作将j&(-j)
清除除最低有效 1 位之外的所有位,其中-j
是视为有符号整数的j
负数j
。https://en.wikipedia.org/wiki/Find_first_set
是否有类似的简单操作可以清除除最重要的 1 位之外的所有位?
一个明显的解决方案是使用clz
几乎所有当代处理器中都存在的(计数前导零)操作。还有一个问题Previous power of 2的答案据说比clz
旧的AMD 处理器工作得更快。另请参阅什么是计算仅设置位的数字的最快方法是另一个数字中设置的最高有效位?
我的问题是是否有比使用更简单的东西clz
在某些语言中可能不容易访问。请注意,我需要最重要的 1 位本身,而不是它的位置(对数)。
解决方案
为了定位单词中最高“1”的位置,我正在使用 BSR 组装操作:
static inline uint32_t bsr(uint32_t x) {
uint32_t rc = 0;
__asm__("bsr %1,%0":"=r" (rc):"rm" (x));
return rc;
}
它返回最高“1”的位置。例如,bsr(5) == 2。如果需要此代码用于 64 位“x”,请使用bsrq指令。