咨询(-4)的按位取反结果(即~(-4))及Java中负数按位取反方法
Java中负数的按位取反详解
嘿,刚上手Java的话,按位取反操作确实容易搞懵,我来一步步给你讲明白~
先看~(-4)的结果
在Java里,所有整数都是以补码形式存储的,我们先拆解-4的补码计算过程(以32位int为例):
- 先看正数4的二进制原码:
00000000 00000000 00000000 00000100 - 负数的补码是其绝对值的原码按位取反后加1:
- 4的原码按位取反:
11111111 11111111 11111111 11111011 - 加1后得到-4的补码:
11111111 11111111 11111111 11111100
- 4的原码按位取反:
- 对这个补码执行按位取反
~,每一位0变1、1变0,得到:00000000 00000000 00000000 00000011 - 这个二进制对应的十进制就是3,所以
~(-4) = 3
任意负数的按位取反方法
其实不管是正数还是负数,按位取反都有个通用的公式:~n = -n - 1,针对负数我们可以用更直观的方式理解:
- 假设负数是
-k(k是正整数),代入公式可得:~(-k) = -(-k) -1 = k -1 - 换句话说,一个负数的按位取反结果,就是它的绝对值减1
举几个例子验证下:
~(-5) = 5-1=4(实际计算结果确实为4)~(-1) =1-1=0(没错,~(-1)的结果就是0)~(-100)=100-1=99(你可以用补码方式自行验算)
如果想手动计算任意负数的按位取反,步骤和-4的例子一致:
- 写出该负数绝对值的32位二进制原码
- 对原码按位取反,再加1得到该负数的补码(即内存中存储的形式)
- 对补码再次按位取反,将得到的二进制数转成十进制就是最终结果
内容的提问来源于stack exchange,提问作者rishabh gupta
相关产品推荐
相关产品推荐

