对于无符号整数j
,操作j&(-j)
清除除 least 以外的所有有效1位,其中-j
是{{1}的负数}将j
视为有符号整数。 https://en.wikipedia.org/wiki/Find_first_set
是否有类似的简单操作可以清除除最个有效位以外的所有其他位?
一个明显的解决方案是使用j
(计数前导零)运算,该运算几乎存在于所有当代处理器中。还有一个问题Previous power of 2和一个答案,据说它在旧AMD处理器上的运行速度甚至比clz
高。另请参见What is fastest method to calculate a number having only bit set which is the most significant digit set in another number?
我的问题是,是否有比使用clz
更简单的东西,在某些语言中可能不容易访问。请注意,我需要最高有效的1位本身,而不是其位置(对数)。
答案 0 :(得分: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 指令。