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