如何通过二进制末位判断int变量奇偶及运算效率问题
二进制末位判断整数奇偶的方法与性能说明
具体判断方法
计算机中所有整数本质上都以二进制形式存储,二进制从右往左每一位的权重是2的对应次幂:除了最右侧末位的权重是2^0=1,其余所有位的权重都是2、4、8……这类偶数。偶数相加的结果永远是偶数,偶数加1才会得到奇数,因此只要看二进制最后一位的取值,就能直接判断数字奇偶:
- 将目标整数和
1做按位与运算(写法为n & 1),如果结果为1,说明二进制末位是1,对应数字是奇数 - 如果运算结果为
0,说明二进制末位是0,对应数字是偶数
这个规则对补码存储的负数同样生效,不需要额外处理符号问题。以Python为例,判断逻辑的实现非常简单:
# 传入整数,奇数返回True,偶数返回False def is_odd(n: int) -> bool: return (n & 1) == 1
和取模判断方式的性能对比
直接读取二进制末位判断奇偶速度更快的说法,只在非常极端的场景下成立,99%的实际开发场景里,两种写法没有任何可测量的速度差异:
- 从纯硬件指令逻辑看,通用取模运算需要调用除法器计算余数,耗时确实比单步的按位与操作高。但目前所有成熟的编译器(GCC、Clang、MSVC等)、甚至不少脚本语言的解释器,只要开启基础优化,碰到
n % 2这类对2取模判断奇偶的写法,都会自动把它优化成等价的按位与指令,最终CPU执行的机器码和手写n & 1完全一致,不存在速度差。 - 只有在完全关闭所有编译优化、或者使用的语言/运行环境完全没做这个针对性优化的情况下,按位与判断才会比取模快一点——但这个速度差是纳秒级的,普通业务场景下根本测不出来差异,更不可能成为程序的性能瓶颈。
- 日常写代码优先选团队成员读着最顺畅的写法就好,没必要为了这点几乎不存在的性能优势强行换写法,平白增加后续维护的理解成本。
补充一个容易踩的坑:部分语言中负数取模的结果为负数,比如C语言里
(-1) % 2的返回值是-1,这时候写n % 2 == 1判断负奇数会出错,反而按位与的写法不会受符号规则影响,兼容性更好。
内容的提问来源于stack exchange,提问作者thomas
相关产品推荐
相关产品推荐

