清除所有但最重要的一点

问题描述 投票:3回答:1

对于无符号整数j,操作j&(-j)清除除最不重要的1位之外的所有位,其中-jj的负数,将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位本身,而不是它的位置(对数)。

bit-manipulation bitwise-operators
1个回答
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指令。

© www.soinside.com 2019 - 2024. All rights reserved.