日期:2014-05-20  浏览次数:21157 次

Java 取反~运算符疑惑
直接上代码
public class BitOperatorTest {

public static void main(String[] args) {

int aNum = 144;
int bNum = 26;
Integer cNum = 2;

System.out.println("The result of aNum & bNum is " + (aNum & bNum));
System.out.println("The result of aNum | bNum is " + (aNum | bNum));
System.out.println("The result of aNum ^ bNum is " + (aNum ^ bNum));

System.out.println(Integer.toBinaryString(cNum));
System.out.println(Integer.toBinaryString(~cNum));
System.out.println("The result of ~cNum is " + (~cNum));
}
}


结果输出:
The result of aNum & bNum is 16
The result of aNum | bNum is 154
The result of aNum ^ bNum is 138
10
The result of ~cNum is -3


大牛帮忙解释下最后一句的输出为什么是-3.


------解决方案--------------------
整数取反就是它本身的相反数-1
------解决方案--------------------
因为在Java中,所有数据的表示方式都是以补码形式来表示;然后通过补码转化到原码,结果就出来了!
------解决方案--------------------
首先Integer的取值范围是-2^31到2^31-1,其实2的二进制的表示应该为0000000000000000000000000000010, 第一位是符号位0表示正数,取反之后为11111111111111111111111111111101,符号位变成1了表示负数,二进制转为负数十进制的步骤如下:
1.除去符号位减1,结果为:1111111111111111111111111111100; 

②除去符号位,按位取反;结果为:0000000000000000000000000000011; 

③源码转成相应的十进制,结果为-3。 

详细出处参考:http://www.jb51.net/article/34133.htm