c++ - 立即获取整数中最左边事件位的索引

标签 c++ bit-manipulation bit built-in findfirst

<分区>

如何从左到右而不是从右到左扫描一个整数(二进制)?我知道我可以从左边开始尝试每一位,然后记录最左边的位,但是有没有更快的方法?是否有内置函数可以立即找到整数中最左边的有效位(即 1)?

我知道对于从右到左,我可以做类似的事情

int myInt = 1234;
for(int i = 0; i < 32; i++) {
  int curr_bit = myInt & (1 << i);
  // do something with curr_bit
}

但是,我想从最左边的可用位开始,我想要它的数字“x”,这样 1 << x将指向那个确切的数字 (作为旁注,我正在尝试实现重复平方,我的代码中需要它)。

如有任何帮助,我们将不胜感激!

最佳答案

如果您对实际最快的答案感兴趣(至少在桌面上),这里是:使用 _bit_scan_reverse英特尔编译器和 Clang(可能还有 Visual Studio 和 GCC)支持的内在特性。

#include "immintrin.h"
int main() { printf("%i", _bit_scan_reverse(9)); }

结果:3 (因为 1<<3 = 89 中设置的最高位)。

Documentation

如果您担心可移植性(因为您应该使用像这样的所有专有扩展),只需包含一个后备函数并使用预处理器来选择您需要的实现:

#ifdef __SSE__ // All SSE processors support bsf/bsr
#include "immintrin.h"
static inline int bit_scan_reverse(int n) { return _bit_scan_reverse(n); }
#else
// Fallback implementation here
#endif

请注意,_bit_scan_reverse 为 n=0 返回一个未指定的值.如果这是一个问题,您可以在 bit_scan_reverse 中的代码中添加一个三元组。 : return n == 0 ? 0 : _bit_scan_reverse(n); .

关于c++ - 立即获取整数中最左边事件位的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47725337/

相关文章:

c++ - 如何获得在 C++ 中生成字母表的更简单方法?

c++ - DbgHelp.dll 是 Windows 内置的吗?我可以相信它在那里吗?

c - sizeof 以及当一个字节大于 8 位时?

c - 这个反转位序函数是怎么回事?

c - C语言中如何设置位

c - 面试-位操作

c++ - 用源代码 boost spirit 解析

c++ - boost::algorithm::compare & const char

vb.net - 如何在VB.NET中按位转换?

c# - 根据另一个 bool 值取反一个 bool 值