按位取反运算符 ~ 对整数补码逐位取反,结果为 ~n == -n - 1;例如 ~5 得 -6,且 ~(~n) == n 恒成立,但需注意类型提升与符号扩展影响。

Java 中按位取反运算符 ~ 作用于整数时,直接对二进制补码表示的每一位取反(0 变 1,1 变 0),结果仍是补码形式,因此得到的是原数的「反码」,而非数学意义上的相反数。要得到真正的负数(即相反数),需理解它与补码规则的关系:对一个数取反再加 1 才等于其相反数,即 ~n == -n - 1。
按位取反的本质是逐位翻转补码位
Java 中所有整数类型(byte、short、int、long)都以补码存储。例如:
-
int x = 5;→ 二进制补码(32 位):00000000 00000000 00000000 00000101 -
int y = ~x;→ 每位取反:11111111 11111111 11111111 11111010 - 该结果是补码表示,换算成十进制为
-6(因为最高位为 1,表示负数;按补码规则,取反加 1 得原码绝对值:取反得00000000...00000101,加 1 得6,故为-6)
利用 ~ 实现负数转换的恒等式
由补码定义可推导出关键恒等关系:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
~n == -n - 1(对任意整数n成立) - 等价变形:
-n == ~n + 1,这正是计算机硬件求负数的标准方式 - 因此,若想用
~得到-n,必须显式加 1:int neg = ~n + 1;
注意数据类型宽度和符号扩展
对较小类型(如 byte)使用 ~ 时,Java 会先提升为 int 再运算,可能引入意外符号位:
-
byte b = 1; int result = ~b;→b被提升为int的0x00000001,取反得0xfffffffe(即-2) - 若希望只对低 8 位取反并保持
byte语义,需手动截断:byte masked = (byte) (~b);→ 结果为(byte) 0xfffffffe == -2(仍是补码解释)
常见误用与验证技巧
避免把 ~ 当作「变号」操作符;它不是 - 的替代品:
- 错误写法:
if (~x == 0) ...→ 实际检查的是x == -1,而非x == 0 - 正确验证:
System.out.println(~5); // 输出 -6,System.out.println(~(-6)); // 输出 5(取反两次不恢复原值,因~(~n) == n恒成立,但需注意溢出边界) - 边界情况:
~Integer.MIN_VALUE是2147483647(即Integer.MAX_VALUE),符合恒等式~(-2147483648) == 2147483647
掌握 ~ 的补码行为,关键是记住它只做位翻转,符号和数值含义由补码规则决定,而非直觉上的“加负号”。不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










