按位与
//计算机在运算的时候,都是按照补码方式运算的,所以要得到2的补码;
一,先得到2的补码
//(1)先得到2的源码: 00000000 00000000 00000000 00000010
二,得到2的补码
//(2)因为2是正数,由于正数是三码合一,所以源码,和补码相同
//(3)所以2的补码; 00000000 00000000 00000000 00000010
三.得到3的补码
//(4)得到3的源码: 00000000 00000000 00000000 00000110
四,得到3的补码
//(5)因为3是正数,由于正数是三码合一,所以源码,和补码相同
//(6)3的补码: 00000000 00000000 00000000 00000110
五,按位与&
//(7)2的补码和3的补码按位 &, 位全是1结果才是1
// (8)2的补码: 00000000 00000000 00000000 00000010
// (9)3的补码: 00000000 00000000 00000000 00000110
//(10)按位& 00000000 00000000 00000000 00000010 得到了补码
六.把2&3按位与的结果转为源码
// 计算结果要看源码,所以把上面计算完的补码转为源码,由于正数是三码合一,所以源码,和补码相同
// 所以源码不变是:00000000 00000000 00000000 00000010 = 2
System.out.println(2&3);
}
}
负数按位取反
public class BitOpenator01 {
public static void main(String[] args) {
//一.先得到-2的源码: 10000000 00000000 00000000 00000010
//二.得到补码
// (1)计算的时候是按照补码计算的,所以要的到补码
// (2)由于-2是负数,要想得到-2的补码,要先得到-2的反码;通过反码+1得到补码
// (3)获取正数补码:
// <1>正数的反码=正数的原码符号位不变,其他位取反
// <2>正数的补码=正数的反码+1
// (4)-2的反码计算: -2的原码符号位不变,其他位取反 11111111 11111111 11111111 11111101
// (5)-2的补码计算: 反码+1 11111111 11111111 11111111 11111110
// (6) -2的补码是: 11111111 11111111 11111111 11111110
//三.~-2操作:
// (7) -2是负数,负数按位取反, 0变1,1变0
// (8) ~-2按位取反后的结果是补码: 00000000 00000000 00000000 00000001
// 四.原码的计算
// (8) 转换完的结果是正数,原码,反码,补码相同 00000000 00000000 00000000 00000001 = 1
System.out.println(~-2); //1
}
}
正数按位取反
public class BitOpenator01 {
public static void main(String[] args) {
//一.先得到2的源码: 00000000 00000000 00000000 00000010
//二.得到补码
// (1)计算的时候是按照补码计算的,所以要的到补码,由于2是正数,补码,原码,反码相同
// (2)原码是: 00000000 00000000 00000000 00000010
//三.~2按位取反
// (3)得到取反运算后的补码 11111111 11111111 11111111 11111101
// (4)结果是一个负数,因为结果是负数,不是三码和合一,想看结果要转成原码
// 四.原码的计算
// (5)负数转原码
// <1>负数的反码=负数的补码-1
// <2>负数原码=负数反码,符号位不变,其他位取反
// (6)反码的计算=负数的补码-1 11111111 11111111 11111111 11111100
// (7)原码的计算=负数反码,符号位不变,其他位取反 10000000 00000000 00000000 00000011 = -3
System.out.println(~2);
}
}