对于无符号整数j
,操作j&(-j)
清除除最不重要的1位之外的所有位,其中-j
是j
的负数,将j
视为有符号整数。 https://en.wikipedia.org/wiki/Find_first_set
是否有类似的简单操作可以清除除最重要的1位之外的所有操作?
一个显而易见的解决方案是使用clz
(计数前导零)操作,该操作几乎存在于所有现代处理器中。还有一个问题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位本身,而不是它的位置(对数)。
对于单词中最高“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指令。