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并且你可以使用汇编,那就是位扫描反向指令.根据编译器的不同,可能存在固有的内容.
标签:c-3,c,c11,bit-manipulation,c99 来源: https://codeday.me/bug/20190722/1506445.html