其他分享
首页 > 其他分享> > c – 以最快的方式获取整数位集中前导1的位置?

c – 以最快的方式获取整数位集中前导1的位置?

作者:互联网

参见英文答案 > Compute fast log base 2 ceiling                                    14个
>            Fastest way to count consecutive 1 bits. C++                                    9个
考虑这个计划

#include <iostream>
#include <bitset>
#include <cstdint>
#include <cstdlib>
typedef uint8_t Tnum;
template <typename T>
void printBits(T a)
{
    std::cout << std::bitset<(sizeof(a) * 8)>(a).to_string() << '\n';
}
int main()
{
    printBits(Tnum(15));
    printBits(Tnum(17));
    return EXIT_SUCCESS;
}

它打印

00001111
00010001

现在考虑前面输出中的这2个人

00001111
    ^
00010001
   ^

我想知道,给定一个有符号或无符号整数类型,给定该类型实例的值,我可以得到该模式中前导1的位置,从0开始计数我期望的结果是3对于第一行,第四行为4.涉及的职位总数对我来说也是可以接受的,例如第一行为4,第二行为5.

我目前没有Hacker’s Delight或类似的文字,我找不到任何快速的叮叮当当.

This很有点但它容易出错,它永远不会通过转换测试或一组关于转换的警告标志,至少在我的情况下如此.此外,它可能是一个非最佳选择.

请不要查找表,我愿意接受任何不会导致转换问题并且不使用LUT的内容.对于C89 / 99和C 11.

解决方法:

如果这是X86并且你可以使用汇编,那就是位扫描反向指令.根据编译器的不同,可能存在固有的内容.

bit scan reverse

标签:c-3,c,c11,bit-manipulation,c99
来源: https://codeday.me/bug/20190722/1506445.html