对于有符号的:
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。



