c++中如何判断一个整数是否为4的幂_c++位运算高效算法【详解】
技术百科
冰火之心
发布时间:2026-01-24
浏览: 次 因为n%4==0只是充分不必要条件,如12满足但不是4的幂;正确方法是先用n>0&&(n&(n-1))==0判断是否为2的幂,再用n&0x55555555≠0确认唯一1在偶数位。
为什么不能只用 n % 4 == 0
因为这是充分不必要条件:比如 12 满足 12 % 4 == 0,但它不是 4 的幂(4^1 = 4, 4^2 = 16)。真正要判断的是形如 4^k(k ≥ 0)的数,即 1, 4, 16, 64, 256...。这些数在二进制下有固定模式:1、10、
10000、1000000……也就是只有一个 1,且该 1 出现在偶数位(从 0 开始计数)。
位运算核心思路:先判 2 的幂,再筛偶数位的 1
4 的幂一定是 2 的幂(因为 4^k = (2^2)^k = 2^(2k)),但反之不成立。所以分两步:
- 用
(n > 0) && (n & (n - 1)) == 0判断是否为正的 2 的幂(排除0和负数,且确保只有一个1) - 再确认这个唯一的
1是否落在第 0、2、4、6… 位(即偶数索引位)。最高效方式是用掩码0x55555555(32 位下二进制为01010101010101010101010101010101)与n按位与:只有当n的1落在偶数位时,结果才非零
bool isPowerOfFour(int n) {
return n > 0 && (n & (n - 1)) == 0 && (n & 0x55555555);
}为什么掩码是 0x55555555 而不是 0xAAAAAAAA
0x55555555 的二进制是偶数位全 1(位 0、2、4…),而 0xAAAAAAAA 是奇数位全 1(位 1、3、5…)。我们要保留的是偶数位上的 1,所以必须用前者。若误用后者,4^0 = 1(二进制 1,只在位 0)会因 1 & 0xAAAAAAAA == 0 被错误拒绝。
注意符号与溢出边界
输入是 int,需明确处理负数和 0:
n 直接返回false(负数和零都不是 4 的幂)- 对于 32 位
int,最大合法值是4^15 = 1073741824;4^16 = 4294967296已溢出,无法表示,所以无需考虑更高次幂 - 若用
unsigned int或long long,掩码需对应扩展(如 64 位用0x5555555555555555ULL)
最易被忽略的一点:n & (n - 1) 在 n == 0 时会计算 0 & (-1),结果为 0,但这不代表 0 是 2 的幂——所以 n > 0 必须前置判断,顺序不能颠倒。
# 的是
# 这是
# 更高
# 出现在
# 只有一个
# 判断是否
# 但这
# c++
# int
# 为什么
# 算法
# 掩码
# 落在
# 不代表
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11玩游戏全屏闪退怎么办_Win11全屏优化
- Win10怎样安装Word样式库_Win10安装W
- Windows11怎样开启游戏模式_Windows
- 如何在Golang中使用container/hea
- Win11怎么关闭用户账户控制UAC_Window
- Win11怎么看电池循环次数_Win11笔记本电池
- LINUX怎么设置系统语言_LINUX修改中文环境
- 如何在 ACF 中正确更新嵌套多层 Group 字
- Python随机数生成_random模块说明【指导
- c# 在高并发下使用反射发射(Reflection
- php订单日志怎么记录发货_php记录订单发货操作
- c# 如何深拷贝和浅拷贝
- Win11怎么关闭贴靠布局_Win11禁用窗口最大
- Python与OpenAI接口集成实战_生成式AI
- Golang如何遍历目录文件_Golang fil
- PHP怎么接收URL中的锚点参数_获取#后面参数值
- LINUX怎么查看进程_LINUX ps命令查看运
- Win11麦克风没声音怎么设置_Win11麦克风权
- Win10系统怎么查看端口状态_Windows10
- C++如何编写函数模板?(泛型编程入门)
- MAC如何设置网卡MAC地址克隆_MAC终端修改物
- php能控制zigbee模块吗_php通过串口与c
- Python函数参数高级用法_默认值与可变参数解析
- Windows11如何设置专注助手_Windows
- Windows10电脑怎么设置防火墙出站规则_Wi
- Python网页解析流程_html结构说明【指导】
- Win11怎么关闭自动调节亮度 Win11禁用内容
- Win11怎么关闭搜索历史_Win11清除设备上的
- Win11怎么关闭开机声音_Win11系统启动提示
- Win10怎么关闭自动更新错误重启 Win10策略
- Windows10蓝屏SYSTEM_SERVICE
- windows 10专注助手怎么关闭_window
- Python音视频处理高级项目教程_FFmpegP
- LINUX的SELinux是什么_详解LINUX强
- Win11怎么关闭自动维护 Win11禁用系统自动
- Python文件管理规范_工程实践说明【指导】
- Windows10如何更改盘符名称_Win10重命
- Win11摄像头无法使用怎么办_Win11相机隐私
- php中self::能调用子类重写的方法吗_静态绑
- c++怎么使用std::unique实现去重_c+
- 零基础学会Python自动化办公_高效处理Exce
- MAC如何修改默认应用程序_MAC文件后缀关联设置
- c++中的Tag Dispatching是什么_c
- php命令行怎么运行_通过CLI模式执行PHP脚本
- C++中的constexpr和const有什么区别
- Go 语言标准库为何不提供泛型切片的 Contai
- Windows如何使用注册表查找和删除项?(reg
- Win11怎么查看wifi信号强度_检测Windo
- C#如何使用Channel C#通道实现异步通信
- Win11此电脑不在桌面上_Windows 11桌

QQ客服