方法一:
推荐方法(安全、高效、防溢出)
方法 1:使用 __builtin_clz(GCC 内建函数,推荐)
#include <iostream>
#include <climits>
using namespace std;
int highestPowerOf2(int n) {
if (n <= 0) return 0;
if (n == 1) return 1;
// __builtin_clz: 返回前导零的个数(32位int)
int leading_zeros = __builtin_clz(n);
int highest_bit = 31 - leading_zeros;
// 2^highest_bit
return 1 << highest_bit;
}
int main() {
int n = 2100000000;
cout << highestPowerOf2(n) << endl; // 输出: 1073741824
return 0;
}
方法2:位运算循环(最安全,兼容性强)
#include <iostream>
using namespace std;
int highestPowerOf2(int n) {
if (n <= 0) return 0;
int power = 1;
while (power <= n / 2) { // 关键:用 n/2 防止 power*2 溢出
power *= 2;
}
return power;
}
—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com