1、原码表示法
十进制: +25 -25
二进制原码: 01101 111001
用附加的符号位表示数的正负,符号位加在绝对值最高位之前(最左侧)。通常用“0”表示正数,“1”表示负数。
2、反码表示法
十进制数: +6 -6
二进制原码: 0110 1110
二进制反码: 0110 1001
与原码表示法不同的是数值部分,即正数的反码数值与原码数值相同,负数的反码数值是原码数值按位求反
3、补码表示法
十进制数: +6 -6
二进制原码: 0110 1110
二进制反码: 0110 1001
二进制补码: 0110 1001+1=1010
在补码表示法中,正数的补码和原码以及反码的表示相同。但对于负数,有原码转换到补码的规则为:符号位保持不变,数值部分则是按位求反,任何加1,。
4、在计算机中的数字运算是以补码形式进行的。所以在做位运算时,首先要将数字转换为补码形式。
5、java有7种位运算符:与(&),或(|),异或(^),取反(~),左移(<<),有符号右移(>>),无符号右移(>>>)。
这7种位运算符,运算时,符号位都要参与运算。
有了上面3种规则,java位运算就很简单了,
例子1:与(&)
int a=127;
int b=-2;
int c=a&b;
System.out.println(c);
打出来的是126
运算过程:
先求补码,
127的补码是
00000000 00000000 00000000 01111111,
-2的补码是
11111111 11111111 11111111 11111110
所以a&b的结果是
00000000 00000000 00000000 01111110
这个数仍旧是补码,要求它的原码,很简单,它是正数,原码就是本身,即126。
例子2:取反(~)
int a=Integer.MAX_VALUE;
int b=~a;
System.out.println(b);
打出来的是 -2147483648
运算过程:
a是int中最大的正数,所以a的补码是
01111111 11111111 11111111 11111111
取反后的补码是
10000000 00000000 00000000 00000000
这是个特殊补码,即int中最小的负数,-2147483648。
System.out.println(Integer.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);
打印看看
-2147483648
2147483647
例子3:左移(<<)
int a=1;
int b=a<<31;
System.out.println(b);
打印出来的是 -2147483648
运算过程:
1的补码是
00000000 00000000 00000000 00000001
左移31位后
10000000 00000000 00000000 00000000
这个很眼熟了吧,int中最小的负数,所以是-2147483648。