Java中的与、或、非运算
与(&)运算符
两个位都为1,则为1,否则为0;
public static void positiveAnd(){
//正数的原码、反码、补码都一样
//2的二进制码为: 00000000 00000000 00000000 00000010
int a = 2;
//6的二进制码为: 00000000 00000000 00000000 00000110
int b = 6;
//////////结果: 00000000 00000000 00000000 00000010
System.out.println(a & b);
//结果为:2
}
public static void negativeAnd(){
//原码取反是反码,反码+1是补码
//-2的二进制原码: 10000000 00000000 00000000 00000010
//-2的二进制反码: 11111111 11111111 11111111 11111101
//-2的二进制补码: 11111111 11111111 11111111 11111110
int a = -2;
///6的二进制码为: 00000000 00000000 00000000 00000110
int b = 6;
//-2的二进制补码: 11111111 11111111 11111111 11111110
///6的二进制码为: 00000000 00000000 00000000 00000110
//////运算后结果: 00000000 00000000 00000000 00000110
System.out.println(a & b);
//结果为:6
}
或(|)运算符
两个位中只要有一个位为1,则为1,否则为0;
public static void positiveOr(){
//正数的原码、反码、补码都一样
//2的二进制码为: 00000000 00000000 00000000 00000010
int a = 2;
//6的二进制码为: 00000000 00000000 00000000 00000110
int b = 6;
//////////结果: 00000000 00000000 00000000 00000110
System.out.println(a | b);
//结果为:6
}
public static void negativeOr(){
//原码取反是反码,反码+1是补码
//-2的二进制原码: 10000000 00000000 00000000 00000010
//-2的二进制反码: 11111111 11111111 11111111 11111101
//-2的二进制补码: 11111111 11111111 11111111 11111110
int a = -2;
///6的二进制码为: 00000000 00000000 00000000 00000110
int b = 6;
//-2的二进制补码: 11111111 11111111 11111111 11111110
///6的二进制码为: 00000000 00000000 00000000 00000110
//////运算后结果: 11111111 11111111 11111111 11111110
System.out.println(a | b);
//结果为:-2
}
非(~)运算符
正数:取反为补码,从补码换算成原码
负数:从原码换算成补码,然后在取反
public static void positiveNot(){
//正数的原码、反码、补码都一样
//2的二进制码为: 00000000 00000000 00000000 00000010
int a = 2;
//////取反后结果(补码): 11111111 11111111 11111111 11111101
////////////二进制反码: 11111111 11111111 11111111 11111100
////////////二进制原码: 10000000 00000000 00000000 00000011
System.out.println(~a);
//结果为:-3
}
public static void negativeNot(){
////-2的二进制原码: 10000000 00000000 00000000 00000010
////////二进制反码: 11111111 11111111 11111111 11111101
////////二进制补码: 11111111 11111111 11111111 11111110
int a = -2;
//(补码)取反后结果: 00000000 00000000 00000000 00000001
System.out.println(~a);
//结果为:1
}
异或(^)运算符
相同为0,不同为1;
public static void positiveXOR(){
//相同为0,不同为1
//2的二进制码为: 00000000 00000000 00000000 00000010
int a = 2;
//6的二进制码为: 00000000 00000000 00000000 00000110
int b = 6;
////////////结果(补码): 00000000 00000000 00000000 00000101
////////////二进制反码: 00000000 00000000 00000000 00000100
////////////二进制原码: 00000000 00000000 00000000 00000100
System.out.println(a ^ b);
//结果为:4
}
public static void negativeXOR(){
//相同为0,不同为1
//-2的二进制原码: 10000000 00000000 00000000 00000010
//-2的二进制反码: 11111111 11111111 11111111 11111101
//-2的二进制补码: 11111111 11111111 11111111 11111110
int a = -2;
///6的二进制码为: 00000000 00000000 00000000 00000110
int b = 6;
//////结果(补码): 11111111 11111111 11111111 11111000
//////二进制反码: 11111111 11111111 11111111 11110111
//////二进制原码: 10000000 00000000 00000000 00001000
System.out.println(a ^ b);
//结果为:-8
}