这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战 | 创作学习持续成长,夺宝闯关赢大奖 - 掘金 (juejin.cn)
4.逻辑运算符
/*
运算符四:逻辑运算符
& && | || ! ^
说明:
1.逻辑运算符操作的都是boolean类型变量
*/
class LogicTest{
public static void main(String[] args){
//区分&和&&
//相同点1:&与&&运算结果相同
//相同点2:当符号左边是true时,二者都会执行符号右边的运算
//不同点:当符号左边是false时,&继续执行符号右边操作,&&不执行符号右边操作
boolean b1=true;
b1 = false;
int num1=10;
if(b1 & (num1++ > 0)){
System.out.println("我现在在北京");
}else{
System.out.println("我现在在南京");
}
System.out.println("num1 = " + num1);
boolean b2=true;
b2 = false;
int num2=10;
if(b2 && (num2++ > 0)){
System.out.println("我现在在北京");
}else{
System.out.println("我现在在南京");
}
System.out.println("num2 = " + num2);
//区分|与||
//相同点1:|与||运算结果相同
//相同点2:当符号左边是false时,二者都会执行符号右边的运算
//不同点:当符号左边是true时,|继续执行符号右边操作,||不执行符号右边操作
boolean b3=true;
int num3=10;
if(b3 | (num3++ > 0)){
System.out.println("我现在在北京");
}else{
System.out.println("我现在在南京");
}
System.out.println("num3 = " + num3);
boolean b4=true;
int num4=10;
if(b4 || (num4++ > 0)){
System.out.println("我现在在北京");
}else{
System.out.println("我现在在南京");
}
System.out.println("num4 = " + num4);
//短路与和或当第一个运算就可以判断出结果时,第二个不执行
//推荐使用短路逻辑运算符
}
}
5.位运算符
位运算是直接对整数二进制的运算
/*
运算符五:位运算符(二进制)
结论:
位运算操作的都是整型变量
<<在一定范围内每向左移以为,相当于*2
>>在一定范围内每向右移一位,相当于/2
>>若最高位为1用1补,最高位为0用0补
>>>无符号右移,无论最高位为0或1都用0补
面试题:
最高效的2*8?
2 << 3或8 << 1
*/
class BitTest{
public static void main(String[] args){
int i=21;
System.out.println("i << 2:" + (i<<2));//i*2*2
System.out.println("i << 2:" + (i<<3));//i*2*2*2
System.out.println("i << 2:" + (i<<26));//i*2^26
System.out.println("i << 2:" + (i<<27));//超过限度
int m=12;
int n=5;
System.out.println("m & n:"+(m&n));//只要一个是0就是0,两个都是1才为1
System.out.println("m | n:"+(m|n));//只要有一个是1就为1,两个都是0才为2
System.out.println("m ^ n:"+(m^n));//两个相同为1,不同为0
//~取反就是0变1,1变0
//练习:交换两个变量的值
int num1 = 10;
int num2 = 20;
System.out.println("num1 = "+num1+";num2 = "+num2);
//方式一:定义临时变量(推荐)
int temp = 0;
temp = num1;
num1 = num2;
num2 = temp;
System.out.println("num1 = "+num1+";num2 = "+num2);
//方式二:不用开辟临时变量,但是相加后可能超出存储范围而且有局限性只能数值型
num1 = num1 + num2;
num2 = num1 - num2;
num1 = num1 - num2;
System.out.println("num1 = "+num1+";num2 = "+num2);
//方式三:使用位运算符m = k ^ n = (m ^ n) ^ n,有局限性只能数值型
num1 = num1 ^ num2;
num2 = num1 ^ num2;
num1 = num1 ^ num2;
System.out.println("num1 = "+num1+";num2 = "+num2);
}
}
6.三元运算符
/*
运算符六
三元运算符
(条件表达式?表达式1:表达式2)
1.条件表达式的变量是一个boolean类型
2.根据条件表达式的真或假,执行表达式,若为true执行表达式1,若为false则为表达式2
3.表达式1和表达式2要求是一致的
4.三运运算符可以嵌套使用
三元运算符与if-else转换
凡是可以使用三元运算符的地方都可以改写为if-else,反之不成立
如果既可以使用三元运算符又可使用if-else推荐使用三元运算符
*/
class SanYuan{
public static void main(String[] args){
//获取两个整数中的较大值
int m = 12;
int n =5;
int max = (m > n ? m : n);
System.out.println(max);
double num = (m > n)?2:1.0;
System.out.println(num);
//****************************
String maxStr = (m > n) ? "m大" : "n大" ;
System.out.println(maxStr);
String maxStr1 = (m > n) ? "m大" :((m == n) ? "m,n" : "n大") ;
System.out.println(maxStr1);
//获取三个数的最大值
int n1 = 12;
int n2 = 30;
int n3 = -43;
int max1 = (n1 > n2)?n1:n2;
int max2 = (max1 > n3)?max1:n3;
System.out.println(max2);
//不推荐
int max3 = (((n1 > n2)?n1:n2)>n3)?((n1>n2)?n1:n2):n3;
System.out.println(max3);
//if-else
if(m>n){
System.out.println(m);
}else{
System.out.println(n);
}
}
}
7.运算符的优先级
只有单目运算符、三元运算符、 赋值运算符是从右向左运算的()