首页 > 解决方案 > 清除除最重要的一位以外的所有内容

问题描述

对于无符号整数j,该操作将j&(-j)清除除最低有效 1 位之外的所有位,其中-j是视为有符号整数的j负数jhttps://en.wikipedia.org/wiki/Find_first_set

是否有类似的简单操作可以清除除重要的 1 位之外的所有位?

一个明显的解决方案是使用clz几乎所有当代处理器中都存在的(计数前导零)操作。还有一个问题Previous power of 2的答案据说比clz旧的AMD 处理器工作得更快。另请参阅什么是计算仅设置位的数字的最快方法是另一个数字中设置的最高有效位?

我的问题是是否有比使用更简单的东西clz在某些语言中可能不容易访问。请注意,我需要最重要的 1 位本身,而不是它的位置(对数)。

标签: bit-manipulationbitwise-operators

解决方案


为了定位单词中最高“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指令。


推荐阅读