
为什么 & 和 && 不能混用?
Java里 & 是位与,&& 是逻辑与,语义和行为完全不同。误用会导致短路失效、空指针或计算错误。
-
&&遇到第一个false就停,不执行右边表达式;&一定两边都算,哪怕左边已是0 - 对布尔变量用
&不报错但失去短路保护,比如obj != null & obj.getValue() > 0可能触发NullPointerException - 对整数必须用
&,&&编译直接失败:int a = 5 & 3合法,5 && 3编译报错bad operand types for binary operator '&&'
1 为啥是负数?
Java中 int 是 32 位有符号补码,左移高位溢出后符号位被置为 1,结果解释为负数。
1 得到的是 <code>0x80000000,即十进制-2147483648,不是2147483648- 想无符号左移?用
long:1L 安全;或转成无符号处理(如 <code>Integer.toUnsignedString(x)) - 右移注意:
>>是带符号右移,>>>是无符号右移;-4 >> 1得-2,-4 >>> 1得2147483646
用 ^ 交换两个变量真能省临时变量?
能,但只适用于同类型整数变量,且存在副作用风险,实际项目里基本不用。
- 写法是
a ^= b; b ^= a; a ^= b;,本质利用x ^ x == 0和x ^ 0 == x - 问题一:如果
a和b指向同一变量(比如数组元素arr[0]和arr[0]),结果变成 0 - 问题二:可读性差,JVM 优化后性能并不比临时变量好,现代 JIT 编译器对
int t = a; a = b; b = t;优化得极好 - 别在浮点、对象、long(没原子性保证)上尝试 ——
double或Long用^会编译失败或行为未定义
判断奇偶用 n & 1 比 n % 2 == 0 快吗?
理论上快,但 JVM 现代版本几乎做了等价优化,实际差异可忽略;不过 n & 1 更明确表达了“看最低位”的意图。
立即学习“Java免费学习笔记(深入)”;
-
n & 1 == 0判断偶数,n & 1 == 1判断奇数,前提是n >= 0;负数时-3 & 1仍得1,所以它其实判断的是“最低位是否为 1”,不是数学奇偶性 -
%对负数结果依赖语言规范(Java 中-3 % 2 == -1),而& 1始终返回 0 或 1,行为更稳定 - 真正影响性能的是分支预测失败或内存访问模式,单个运算符差异早被掩盖;别为了这个改代码,除非你在写 JNI 或 HotSpot 内部逻辑
位运算是底层工具,不是炫技入口。该用 Math.abs() 就别硬写 (n ^ (n >> 31)) - (n >> 31),后者在负数边界、JIT 优化、可维护性上全是坑。










