当模数为2的整数次幂时,可用x & (m-1)替代x % m(x≥0),因其等价于保留低n位二进制;但负数时二者结果不同,java中需先转非负。

当模数是 2 的整数次幂(如 4、8、16、1024 等)时,可以用位运算 & (按位与) 快速替代取模运算 %,前提是操作数为非负整数。
为什么能用位运算代替?
因为对 2^n 取模,等价于保留该数的低 n 位二进制位。而 x % (2^n) 在 x ≥ 0 时,完全等于 x & ((1 。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
例如:13 % 8 → 13 & 7 → 1101₂ & 0111₂ = 0101₂ = 5,结果一致。
怎么写才安全有效?
- 确保模数是 2 的正整数次幂(即
m == 1 ,且 <code>m > 0) - 确保被模数
x是非负整数(x >= 0),否则位运算结果不等于取模(Java 中负数取模返回负余数,而&永远非负) - 常用写法:
x & (m - 1),其中m是 2 的幂(如m = 16→x & 15)
常见使用场景
-
哈希表桶索引计算:比如数组长度为 16,用
hash & 15替代hash % 16 -
环形缓冲区下标 wrap-around:容量设为 2 的幂,下标用
index & (capacity - 1) -
快速判断是否为 2 的幂:配合
(x & (x - 1)) == 0 && x > 0验证模数合法性
注意事项
Java 的 % 对负数返回负余数(如 -5 % 4 == -1),而 & 运算恒为非负(-5 & 3 == 3)。若业务需兼容负数,必须先做非负转换(如 (x & mask) + (x 不推荐;更稳妥做法是先 <code>x %= m 再调整,或统一用非负输入)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










