java中用左移1实现除2(非负数等价于/2);负数右移结果与/2不同,需加1再右移或直接用/2更安全。

Java 中用位运算实现乘除 2,核心是利用二进制左移()和右移(<code>>>)操作:左移 1 位等价于乘以 2,右移 1 位等价于除以 2(向零取整)。
乘以 2:用左移
对一个整数 n,n 相当于 <code>n * 2。原理是二进制表示整体左移一位,低位补 0,数值翻倍。
- 正数:如
5 → <code>101→1010= 10 ✅ - 负数:Java 使用补码,
-3 = <code>-6,仍成立 ✅ - 注意溢出:如
Integer.MAX_VALUE 会溢出成负数,需自行校验
除以 2:用右移 >> 1(适用于非负数)
n >> 1 对非负整数等价于 n / 2(向下取整,即截断小数)。例如:7 >> 1 = 3,8 >> 1 = 4。
- 非负数安全:结果与
n / 2完全一致 - 负数需谨慎:
-7 >> 1= -4(算术右移,符号位扩展),而-7 / 2= -3(Java 向零取整)→ 结果不同 - 若需严格匹配
/行为(向零取整),负数建议用n >> 1仅限n >= 0;或统一用n / 2
更安全的除以 2:结合符号处理(可选)
如果坚持位运算且要兼容负数并匹配 /,可这样写:
int div2(int n) {
return (n >= 0) ? (n >> 1) : ((n + 1) >> 1);
}
原理:负数先加 1 再右移,模拟向零取整(如 -7 → -6 → -3;-8 → -7 → -4?不对,实际应为 -8/2=-4,所以更稳妥的是只对负奇数调整)。但实践中,除非性能极端敏感且已确认输入范围,否则直接用 n / 2 更清晰可靠。
注意事项
- 位运算只对整数类型(
int,long等)有效,不适用于float/double -
>>是算术右移(保留符号),>>>是逻辑右移(无符号,高位补 0),对正数效果相同,负数慎用>>> - 编译器通常会自动将
* 2// 2优化为位移,手写位运算未必提升性能,但可增强语义表达(如在底层、算法或位图处理中)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











