清除除最高有效位以外的所有位

时间:2019-03-01 03:38:57

标签: bit-manipulation bitwise-operators

对于无符号整数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位本身,而不是其位置(对数)。

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 指令。