1.原码、反码、补码
对于有符号的:
1.二进制的最高位是符号位,0表示正数,1表示负数
2.正数的原码、反码、补码都一样
3.负数的反码:它的原码符号位不变,其他位取反
4.负数的补码:它的反码+1,负数的反码 : 负数的补码 -1
5.0的反码补码都是0
6.java没有无符号数即java中的数都是有符号的
7.在计算机运算的时候,都是以补码的方式来运算的
8.当我们再看运算结果的时候,要看它的原码。
2.位运算
按位与&:两位都为1时为1,否则为0
// 2的补码 00000000 00000000 00000000 00000010
// 3的补码 00000000 00000000 00000000 00000011
// 2 & 3 = 00000000 00000000 00000000 00000010
System.out.println(2&3); //2
按位或|:两位有一个1时为1,否则为0
System.out.println(2|3);//3
//1.2的补码 00000000 00000000 00000000 00000010
// 3的补码 00000000 00000000 00000000 00000011
// 2. 2|3 00000000 00000000 00000000 00000011
按位异或^:两位不同时为1,否则为0
System.out.println(2^3);//1
//1.2的补码 00000000 00000000 00000000 00000010
// 3的补码 00000000 00000000 00000000 00000011
// 2.2^3 00000000 00000000 00000000 00000001
按位取反~:位1->0,0->1
System.out.println(~-2);
// 1. -2的原码 10000000 00000000 00000000 00000010
// 2. -2的反码 11111111 11111111 11111111 11111101
// 3. -2的补码 11111111 11111111 11111111 11111110
// 4. 取反 00000000 00000000 00000000 00000001 ->补码
// 5. 结果为1
System.out.println(~2);//-3
//1.2的补码 00000000 00000000 00000000 00000010
//2.取反 11111111 11111111 11111111 11111101 补码
//3.求该补码的反码 11111111 11111111 11111111 11111100
//4.求该反码的原码 10000000 00000000 00000000 00000011
算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位,右移一次相当与除以2
System.out.println(-2>>2);//-1
//1.1的补码:11111111 11111111 11111111 11111110
//2.右移两位 11111111 11111111 11111111 11111111
//3.因为运算用的是补码 得到的也是补码 查看结果要把它转为原码
//4.原码:该补码的反码11111111 11111111 11111111 11111110
//5.补码的原码 10000000 00000000 00000000 00000001
//6.结果为-1
算术左移<<:符号位不变,低位补0,左移一次相当与乘以2
System.out.println(2<<2);//8
//1.2的补码 00000000 00000000 00000000 00000010
//2.左移两位 00000000 00000000 00000000 00001000
//结果为8
逻辑右移>>>:无符号右移,低位溢出,高位补0
右移左移本质:二进制->10进制:各位数的2的(位数-1)次方之和;左移一位1,相当于多乘一次2。