原码、反码、补码
二进制的最高位是符号位: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