/* 原码、反码和补码
1.二进制的最高位时符号位,0表示正数,1表示负数
2.正数的原码、反码、补码都一样(三码合一)
3.负数的反码 = 原码符号位不变,其他位取反 0变1,1变0
4.负数的补码 = 反码 + 1 ,负数的反码 = 补码 - 1
5.0的反码、补码都是0
6.计算机运算时,都是以 补码 方式来运算的
7.当我们看运算结果时,看的是原码
*/
/* 位运算符
Java中有7个位运算符
按位与&:两位全为1,结果为1,否则为0
按位或|:两位有一个为1,结果为1,否则为0
按位异或^:两位一个为0,一个为1,结果为1,否则为0
按位取反~:0变1,1变0
算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位
算术左移<<:符号位不变,低位补0
逻辑右移(无符号右移)>>>:低位溢出,高位补0
*/
/* 演示1:2&3
1.先得到2的原码 00000000 00000000 00000000 00000010
因为正数三码合一,所以2的补码和原码相同 00000000 00000000 00000000 00000010
2.3的原码 00000000 00000000 00000000 00000011
因为正数三码合一,所以3的补码和原码相同 00000000 00000000 00000000 00000011
3.按位与&:两位全为1,结果为1,否则为0
2的补码:00000000 00000000 00000000 00000010
3的补码:00000000 00000000 00000000 00000011
新补码:00000000 00000000 00000000 00000010
4.因为符号位为0是正数,所以原码就是补码 00000000 00000000 00000000 00000010
5.结果为 2
*/
public class BitOperator {
public static void main(String[] args) {
System.out.println(2&3);
/* 演示2:~-2
1.先得到-2的原码 10000000 00000000 00000000 00000010
2.-2的反码 = 符号位不变,其他取反。 11111111 11111111 11111111 11111101
3.-2的补码 = 反码 + 1. 11111111 11111111 11111111 11111110
4.按位取反~ 0变1,1变0. 00000000 00000000 00000000 00000001
5.结果为1
*/
System.out.println(~-2);
/* 演示3:~2
1.先得到2的原码 00000000 00000000 00000000 00000010
2.2的补码和原码相同 00000000 00000000 00000000 00000010
3.按位取反~0变1,1变0. 11111111 11111111 11111111 11111101
4.负数的反码 = 补码 - 1. 11111111 11111111 11111111 11111100
5.负数的原码 = 符号位不变,其他取反 10000000 00000000 00000000 00000011
6.结果为-3
*/
System.out.println(~2);
/* 演示4:1>>2;
1.得到1的补码 00000000 00000000 00000000 00000001
2.低位溢出,符号位不变,并用符号位补溢出的高位 00000000 00000000 00000000 00000000
3.结果为0,本质是1 / 2 / 2= 0
演示5:1<<2;
1.得到1的补码 00000000 00000000 00000000 00000001
2.符号位不变,低位补0 00000000 00000000 00000000 00000100
3.结果为4,本质1 * 2 * 2 = 4
演示6:15>>2;
本质为 15 / 2 / 2 = 3
演示7:4<<3;
本质为 4 * 2 * 2 * 2= 32
*/
System.out.println(1 >> 2);
System.out.println(1 << 2);
System.out.println(15>>2);
System.out.println(4 << 3);
}
}