我想看看有多少位的int占用,例如count(10)=4,count(7)=3,count(127)=7等
我曾尝试暴力破解(<<荷兰国际集团一1,直到它的严格的数量比大),并使用floor(log2(v))+1,但两者都太慢我的需要。
我知道有一个__builtin_popcnt函数可以快速计算1s 中有多少个s int,但是我很难找到适合我的应用程序的内置函数,是否没有这样的函数或者我忽略了什么?
编辑:我正在使用g++版本9.3.0
Edit2:mediocrevegetable1 的答案被选中,因为它是当时唯一可用的答案g++。但是,未来的读者也可以尝试 chris 的答案以获得更好的兼容性或希望编译器能够提供更高效的执行。
chr*_*ris 10
添加了 C++20 std::bit_width(现场示例):
#include <bit>
#include <iostream>
int main() {
std::cout
<< std::bit_width(10u) << ' ' // 4
<< std::bit_width(7u) << ' ' // 3
<< std::bit_width(127u); // 7
}
Run Code Online (Sandbox Code Playgroud)
例如,使用 Clang trunk 和 ,-O3 -march=skylake一个只执行调用的函数bit_width会生成以下程序集:
count(unsigned int):
lzcnt ecx, edi
mov eax, 32
sub eax, ecx
ret
Run Code Online (Sandbox Code Playgroud)
这个新<bit>标题中也有许多类似的功能。你可以在这里看到它们。
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |