原码、反码、补码&位运算符

原码、反码、补码

二进制的最高位是符号位:0表示正数,1表示负数。

正数的原码、反码、补码都一样(三码合一)。

负数的反码 = 它的原码符号位不变,其他位按位取反(0 —>1,1 —>0)。

负数的补码 = 它的反码 + 1。

负数的反码 = 负数的补码 - 1。

0的反码,补码都是0。

java没有无符号数,换言之,java中的数都是有符号的。

在计算机运算时,都是以补码的方式来运算的。

当我们看运算结果的时候,要看它的原码(重点)。

位运算符

java中有7个位运算(&、|、^、~、>>、<< 和 >>>)

按位与&      :两位全为1,结果为1,否则为0
按位或 |         :两位有一个位1,结果为1,否则为0
按位异或 ^  :两位有一个为0,一个为1,结果为1,否则为0
按位取反 ~  :0 -> 1, 1 -> 0

例如: 2&3   的结果为:2

1、先得到2的补码 => 2的原码 00000000 00000000 00000000 00000010
   2的补码 00000000 00000000 00000000 00000010
   
2、3的原码 00000000 00000000 00000000 00000011
   3的补码 00000000 00000000 00000000 00000011
   
3、按位&
	00000000 00000000 00000000 00000010
	00000000 00000000 00000000 00000011
 ————————————————————————————————————————————
 	00000000 00000000 00000000 00000010  //& 运算后的补码
 
 运算后的原码也是 00000000 00000000 00000000 00000010
 结果就是 2
例如: ~-2	的结果为:1

1、先得到-2的原码 10000000 00000000 00000000 00000010

2、-2的反码 11111111 11111111 11111111 11111101

3、-2的补码 11111111 11111111 11111111 11111110

4、 ~-2操作 00000000 00000000 00000000 000000001 //运算后的补码

5、 运算后的原码就是 00000000 000000000 00000000 00000001
    结果就是1
例如: ~2	的结果为:-3

1、先得到2的补码 00000000 00000000 00000000 00000010

2、~2操作 11111111 11111111 11111111 11111101 //运算后的补码

3、运算后的反码 11111111 11111111 11111111 11111110

4、运算后的原码 10000000 00000000 00000000 00000011 => -3
   结果就是-3

1、算数右移 >> :低位溢出,符号位不变,并用符号位补溢出的高位
2、算数左移 >> :符号位不变,低位补 0
3、>>> 逻辑右移也叫无符号右移,运算规则是:低位溢出,高位补 0

>> 和 >>> 的区别:
如果正数右移,则高位都补0;如果负数右移,>> 高位补1,>>> 高位补 0。

特别说明:没有 <<< 符号

例如:
int a = 1>>2; // 1=> 00000001 => 00000000 本质 1/2/2 = 0
int c = 1<<2; // 1=> 00000001 => 00000100 本质 1*2*2 = 4

你可能感兴趣的:(JAVA,java)