C++20中判断正整数是否为2的n次幂:哪种方法CPU效率更高?
判断正整数是否为2的幂:两种方法的CPU效率对比
判断一个正整数n是否为2的幂(如1、2、4、8这类数),有两种常用实现方式,我们从CPU效率角度对比哪种更优:
方法一:按位与运算判断
利用2的幂的二进制表示中置位不超过1位的特性,代码实现如下:
bool test = n & (n - 1) == 0;
这个操作效率极高,仅涉及减法、按位与运算,以及基于零标志位(ZF)的条件分支。当表达式结果为true时,即可判定n是2的幂。
方法二:使用std::popcount统计置位
C++20标准库提供了std::popcount(种群计数)函数,用于统计二进制中1的位数,代码实现如下:
bool test = std::popcount(n) == 1; // (C++20起支持)
若硬件支持POPCNT指令,该函数的执行速度会非常快。
C++通常遵循「按需付费」原则,而本次判断仅需确认是否只有1个置位,并不需要统计具体的置位数量。
CPU效率对比
从CPU执行效率来看,第一种方法更具优势:
- 第一种方法仅需3个基础单周期指令:减法、按位与、零标志位判断,几乎无额外开销。
- 第二种方法即便硬件支持POPCNT指令,本质上完成了「统计所有置位数量」的完整操作,做了超出需求的计算,违背了「按需付费」原则;若硬件不支持POPCNT,编译器会生成模拟代码,效率会进一步降低。
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

