<p>按位取反(~)是对操作数的32位补码逐位取反,结果仍为补码,直接解释为有符号整数;通用公式为 ~x == -x - 1。</p>

按位取反(~)在 Java 中是对操作数的**二进制补码表示**逐位取反(0 变 1,1 变 0),结果仍是补码形式,直接解释为有符号整数。负数的补码不是“额外计算”出来的,而是 Java 整数**天然以补码存储**,所以 ~x 的结果只需按补码规则解读即可,无需手动转换原码反码。
理解前提:Java 整数默认用补码表示
Java 中 int 是 32 位有符号整数,所有值(正、负、零)都以补码形式存于内存。例如:
-
5的补码是:00000000 00000000 00000000 00000101 -
-5的补码是:11111111 11111111 11111111 11111011(即:先算 5 的原码,取反得反码,再加 1)
你写的 int x = -5;,JVM 已经把它存为上面那个 32 位补码。按位取反操作的对象就是这个补码比特序列。
按位取反运算的实质:对补码比特串逐位翻转
~x 不区分正负——它只把变量当前的 32 位比特(无论代表什么数值)每一位都取反。
立即学习“Java免费学习笔记(深入)”;
例如:int x = -5;
-
x的补码(32 位):11111111 11111111 11111111 11111011 - 逐位取反
~x:00000000 00000000 00000000 00000100 - 这个结果是
4的补码(也是原码、反码),所以~(-5) == 4
再如:int y = 3;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
y补码:00000000 00000000 00000000 00000011 -
~y:11111111 11111111 11111111 11111100 - 这是个负数补码,按补码规则还原:减 1 得反码
11111111 11111111 11111111 11111011,再取反得原码00000000 00000000 00000000 00000100→ 即4,所以值为-4 - 因此
~3 == -4
记住这个通用公式(适用于所有整数)
对任意 int 值 x,都有:
~x == -x - 1
验证:
-
~5 == -5 - 1 == -6✅(5 补码取反后确实是 -6) -
~-2 == -(-2) - 1 == 2 - 1 == 1✅(-2 补码是...1110,取反得...0001= 1) -
~0 == -0 - 1 == -1✅(0 补码全 0,取反全 1 → -1 补码)
这个公式源于补码定义:负数 -x 的补码等于 ~x + 1,移项即得 ~x == -x - 1。它比手动写二进制更高效可靠。
常见误区提醒
❌ 不要试图对负数“先转原码再取反”来算 ~x——Java 没有原码存储,操作的是补码比特流。
❌ 不要只看最高位(符号位)就停止判断——必须看全部 32 位,因为取反后符号位也会变。
✅ 正确做法:把 x 当作一个固定长度的比特序列(如 int 就是 32 位),无条件逐位翻转,然后按补码规则解释结果(或直接套用 ~x == -x - 1)。

















