原码
一个正数的原码,是按照绝对值大小转换成的二进制数。
一个负数的原码,是按照绝对值大小转换成的二进制数,然后最高位补1。
00000000 00000000 00000000 00000101 是5的原码。
10000000 00000000 00000000 00000101 是-5的原码。
反码
正数的反码与原码相同。
负数的反码为对该数的原码除符号位外各位取反。
00000000 00000000 00000000 00000101 是5的反码。
11111111 11111111 11111111 11111010 是-5的反码。
补码
正数的补码与原码相同。
负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.
比如:10000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111011。
总结
正数的反码和补码都与原码相同。
负数的反码为对该数的原码除符号位外各位取反。
负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1。
与运算 &
具体规则为:两个二进制对应位都为1时,结果为1,否则结果为都0。
int a = 5; // 0000 0000 0000 0000 0000 0000 0000 0101
int b = 3; // 0000 0000 0000 0000 0000 0000 0000 0011
a &= b; // 0000 0000 0000 0000 0000 0000 0000 0001
System.out.println(a);
或运算 |
具体规则为:两个二进制对应位为0时该位为0,否则为1。
int a = 5; // 000 0000 0000 0000 0000 0000 0000 0101
int b = 3; // 0000 0000 0000 0000 0000 0000 0000 0011
a |= b; // 0000 0000 0000 0000 0000 0000 0000 0111
System.out.println(a);
异或运算 ^
具体规则为:两个二进制对应位相同时,结果为0,否则结果为1。
int a = 5; // 000 0000 0000 0000 0000 0000 0000 0101
int b = 3; // 0000 0000 0000 0000 0000 0000 0000 0011
a ^= b; // 0000 0000 0000 0000 0000 0000 0000 0110
System.out.println(a);
非运算 ~
具体规则为:操作数的第n位为1,那么结果的第n位为0,反之亦然。
int a = 5; // 000 0000 0000 0000 0000 0000 0000 0101
int b = ~a; // 1111 1111 1111 1111 1111 1111 1111 1010
System.out.println(b);
左移 <<
具体规则:左移,低位补0。
public class Test {
public static void main(String[] args) {
System.out.println(5<<2);
}
}
前: 0000 0000 0000 0000 0000 0000 0000 0101
后:0000 0000 0000 0000 0000 0000 0001 0100
右移 >>
具体规则:右移,高位补0。
public class Test {
public static void main(String[] args) {
System.out.println(5>>2);
}
}
前:0000 0000 0000 0000 0000 0000 0000 0101
后:0000 0000 0000 0000 0000 0000 0000 0001
无符号右移 >>>
-5换算成二进制:1111 1111 1111 1111 1111 1111 1111 1011
-5右移3位后结果为-1:1111 1111 1111 1111 1111 1111 1111 1111 // (用1进行补位)
-5无符号右移3位后的结果:0001 1111 1111 1111 1111 1111 1111 1111 // (用0进行补位)
无符号左移 <<<
正数或者负数左移(无符号左移),低位都是用0补。