java中求整数绝对值的位运算方法是:(n ^ mask) - mask,其中mask = n >> 31;对int利用符号位广播生成掩码,负数时mask为0xffffffff实现取反加1,正数时mask为0保持原值,且兼容integer.min_value。

Java 中求整数绝对值而不使用 if、三元运算符等分支语句,核心思路是利用**位运算**和**补码特性**,通过掩码(mask)提取符号位,再做异或与减法组合操作。关键在于:负数的绝对值等于其按位取反后加 1(即补码定义),而我们可以用符号位自动生成这个“是否需要取反加 1”的逻辑。
利用符号位构造掩码
对一个 int 类型变量 n,右移 31 位(n >> 31)会把符号位(最高位)复制到所有位上:
- 若 n ≥ 0,结果为 0x00000000(即 0);
- 若 n ,结果为 <code>0xFFFFFFFF(即 -1,全 1)。
这个值可直接作为掩码(mask)参与后续运算。
经典无分支公式
绝对值可表示为:
(n ^ mask) - mask
其中 mask = n >> 31。
- 当
n ≥ 0:mask = 0 →(n ^ 0) - 0 = n - 当
n :mask = -1(即 0xFFFFFFFF)→ <code>(n ^ -1)等价于~n(按位取反),再减 -1 相当于加 1,即~n + 1,正是负数的补码绝对值。
完整代码示例
public static int abs(int n) {
int mask = n >> 31;
return (n ^ mask) - mask;
}
该方法适用于所有 int 取值范围(包括 Integer.MIN_VALUE),但要注意:
- 对 Integer.MIN_VALUE(-2147483648),其绝对值在 int 范围内溢出,数学上无法表示,此公式仍返回 Integer.MIN_VALUE(符合 Math.abs() 的行为);
- 不依赖任何条件跳转,纯位运算,适合对分支预测敏感的场景(如高频循环、JNI 优化等)。扩展:long 类型怎么办?
同理,对 long 使用 n >> 63 得到 mask,再套用 (n ^ mask) - mask 即可:
mask = n >> 63return (n ^ mask) - mask;
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











