import org.junit.Test;
public class SymbolOperator {
//&(按位与) 1&1=1 , 1&0=0 , 0&1=0 , 0&0=0
//0000 0110 = 6
//0000 0001 = 1
//6 & 1 = 0
@Test
public void test1(){
int a = 6;
int b = 1;
int c = a & b;
System.out.println(c);
}
//&&(逻辑与)
//也称短路运算,先计算左边的表达式,一旦为假,则整体为假
@Test
public void test2(){
if(2 < 1 && 4 < 5){
System.out.println("ture");
}else{
System.out.println("false");
}
}
//|(按位或) 1|0 = 1 , 1|1 = 1 , 0|0 = 0 , 0|1 = 1
// 这里我们和按位与作比较
//0000 0110 = 6
//0000 0001 = 1
//6 & 1 = 7
@Test
public void test3(){
int a = 6;
int b = 1;
int c = a | b;
System.out.println(c);
}
//||(逻辑或)
//这里我们和逻辑与比较
@Test
public void test4(){
if(2 < 1 || 4 < 5){
System.out.println("ture");
}else{
System.out.println("false");
}
}
//^(异或运算符) 1^0 = 1 , 1^1 = 0 , 0^1 = 1 , 0^0 = 0
//0000 0110 = 6
//0000 0001 = 1
//6 & 1 = 7
@Test
public void test5(){
int a = 6;
int b = 1;
int c = a ^ b;
System.out.println(c);
}
//<<(左移运算符) 正负数都是右边补0, 正数左边第一位补0,负数补1
@Test
public void test6(){
System.out.println(5 << 2);
System.out.println(-5 << 2);
}
//>>(右移运算符) 正数左边第一位补0,负数补1
//这里说明负数右移动,先求出负数补码,符号位不变,高位补1
@Test
public void test7(){
System.out.println(5 >> 2);
System.out.println(-5 >> 2);
}
//~(取反运算符) 取反就是1为0,0为1
//正数取反对负数补码取反
//负数取反先将求负数补码然后取反
@Test
public void tes8(){
System.out.println(~5);
System.out.println(~-5);
}
//>>>(无符号右移运算符)
//主要区别在于负数, 先转32位补码, 右移高位补0,移动的时候带符号位一起移动
@Test
public void test8(){
//正数无符号右移
System.out.println(15 >>> 2);
//负数无符号右移
System.out.println(-10 >>> 3);
}
}