有没有内置函数可以快速计算int类型整数所占的二进制位数?
int类型有效二进制位数快速计算方案
g++ 平台原生实现
你需要的功能可以直接用g++ 9.3.0支持的__builtin_clz系列内置函数实现,该函数用于统计无符号整数二进制表示的高位前导0的个数,计算逻辑为:总位数 - 前导0个数 = 有效二进制位数。
- 32位无符号int:
32 - __builtin_clz(非0值) - 64位无符号long long:
64 - __builtin_clzll(非0值)
示例计算:10的二进制为1010,32位下前导0共28个,32-28=4,和你给出的count(10)=4完全匹配。
注意:
__builtin_clz入参为0时属于未定义行为,如果你的输入可能包含0,需要单独判断返回对应默认值。
该函数会被直接编译为CPU原生指令(x86平台为lzcnt/bsr、ARM平台为clz),单周期即可完成计算,性能远高于移位法和log2计算法,完全满足高性能场景需求。
跨平台兼容实现
如果需要适配MSVC等其他编译器,且使用环境支持C++20及以上标准,可以直接用标准库提供的std::bit_width函数,该函数定义在<bit>头文件中,直接传入非0无符号整数即可得到有效二进制位数,语法更简洁,行为统一规范,编译器也会针对该函数做最高效的指令映射。
示例代码
// g++专用版本 #include <iostream> inline int count(unsigned int v) { return v == 0 ? 0 : 32 - __builtin_clz(v); } // C++20跨平台版本(可选) // #include <bit> // inline int count(unsigned int v) { // return std::bit_width(v); // } int main() { std::cout << count(10) << std::endl; // 输出4 std::cout << count(7) << std::endl; // 输出3 std::cout << count(127) << std::endl; // 输出7 return 0; }
内容的提问来源于stack exchange,提问作者xkcdjerry
相关产品推荐
相关产品推荐

