分类:&与 && 短路与 |或 ||短路或 ^异或 !非
1.1 & 和 | 的使用:
&:逻辑与(而且) 两边都为真,结果才是真,只要有一个为假,那么结果就是假。(见假即假)
|:逻辑或(或者) 两边都为假,结果才是假,只要有一个为真,那么结果就是真。(见真即真)
**&&:**见假即假,只不过具有短路效果。
||: 见真即真,只不过具有短路效果。
^(异或)的使用:
计算规则:如果两边相同,为false,如果两边不同,为true
!(取反)的使用:
是取反,也叫做非。 false取反就是true,true取反就是false
温馨提示:**取反最多只用一个。*
注:&与,|或:判断l前者,还会判断后者;&&短路与,||短路或:判断了前者,不会判断后者,效率更高。
总结:
1.逻辑运算符运行结果都是boolean类型
2.&、&&、|、||、^ 两侧都是boolean类型数据
3.!为非,就是置反,true变成false,false变成true4.&& 和 & 、||和|的运行结果都是一模一样的,但是短路逻辑运算符可以提高程序的运行效率。
建议:
最为常用: && || !
//练习题:在cmd窗口输入一个数字,判断是否在50~100的区间内
Scanner scan = new Scanner(System.in);
System.out.println("请输入数字:");
int num = scan.nextInt();
boolean bool = num>=50 && num<=100;
System.out.println("该数字是否在50~100的区间内:" + bool);
核心技巧:
两侧都是数值就是算数,一侧是拼接!
* 当+操作中出现字符串时,此时就是字符串的连接符,会将前后的数据进行拼接,并产生一个新的字符串。
* 当连续进行+操作时,从左到右逐个执行的。
特例:字符串只有+操作,没有其他操作
规则:
当+操作中出现了字符,会拿着字符到计算机内置的ASCII码表中去查对应的数字,然后再进行计算。
// 案例:
char c = 'a';
int result = c + 0;
System.out.println(result);//97
//ASCII码表中: 'a' ----- 97 'A' ----- 65
**格式:**变量 = (表达式)?值1:值2;
计算规则:
表达式的结果必须是boolean
true - 将值1赋值给变量
false - 将2赋值给变量
注意点:
三元运算符的最终结果一定要被使用,要么赋值给一个变量,要么直接打印出来。
//需求:在控制台输入3个int类型的数字,由小到大输出
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数字:");
int a = scan.nextInt();
System.out.println("请输入第二个数字:");
int b = scan.nextInt();
System.out.println("请输入第三个数字:");
int c = scan.nextInt();
//最大值
int max = (a>b)?a:b;
max = (max>c)?max:c;
//最小值
int min = (a<b)?a:b;
min = (min<c)?min:c;
//中间值
int mid = a+b+c-max-min;
System.out.println(min + "<" + mid + "<" + max);
扩展面试题1:
int a = 5;
System.out.println((a<5)?10.9:9);//9.0 都是数字字面量
? 扩展面试题2:
char x = 'x';//Unicode - 120
int i = 10;
System.out.println(false?i:x);//120 都是变量
? 扩展面试题3:
char x = 'x';//Unicode - 120
System.out.println(false?100:x);//x
System.out.println(false?100000:x);//120
/**
三目运算符的返回值规则:
1.值1和值2都是常量的情况,按照取值范围大的类型返回数据
2.值1和值2都是变量的情况,按照取值范围大的类型返回数据
3.值1和值2一个是常量一个是变量的情况,判断常量是否在变量所属的取值范围内
在 - 按照变量的类型返回数据
不在 - 按照常量的类型返回数据
*/
扩展 - 常量:程序执行过程中不可发生改变的量
注意:数字字面量(给出来的值)就是常量的一种
理解:将十进制的数据转换为二进制再做运算
符号:&与 |或 ^异或 <<左移 >>右移 >>>无符号位右移
//&与:同位比较,两者为1,结果才为1
byte b1 = 23;//0001,0111
byte b2 = 27;//0001,1011
//0001,0011
//b1 - byte:0001,0111
// int:0000,0000,0000,0000,0000,0000,0001,0111
//b2 - byte:0001,1011
// int:0000,0000,0000,0000,0000,0000,0001,1011
// 结果:0000,0000,0000,0000,0000,0000,0001,0011
// (byte):0001,0011
byte result = (byte)(b1 & b2);
System.out.println(result);//19 - 0001,0011
//|或:同位比较,两者有1,结果就为1
byte b1 = 23;//0001,0111
byte b2 = 27;//0001,1011
//0001,1111
//b1 - byte:0001,0111
// int:0000,0000,0000,0000,0000,0000,0001,0111
//b2 - byte:0001,1011
// int:0000,0000,0000,0000,0000,0000,0001,1011
// 结果:0000,0000,0000,0000,0000,0000,0001,1111
// (byte):0001,1111
byte result = (byte)(b1 | b2);
System.out.println(result);//31 - 0001,1111
//^异与:同位比较,两者相同为0,不同为1
byte b1 = 23;//0001,0111
byte b2 = 27;//0001,1011
//0000,1100
//b1 - byte:0001,0111
// int:0000,0000,0000,0000,0000,0000,0001,0111
//b2 - byte:0001,1011
// int:0000,0000,0000,0000,0000,0000,0001,1011
// 结果:0000,0000,0000,0000,0000,0000,0000,1100
// (byte):0000,1100
byte result = (byte)(b1 ^ b2);
System.out.println(result);//12 - 0000,1100
//<<左移:整体向左移动n位,就用n个0补位(补到最低位)
int num = 128;//0000,0000,0000,0000,0000,0000,01000,0000
System.out.println(num << 2);//512 - 0000,0000,0000,0000,0000,0010,0000,0000
//>>右移:整体向右移动n位,就用n个最高位补位(补到最高位)
int a = 128;//0000,0000,0000,0000,0000,0000,01000,0000
System.out.println(a >> 2);//32 - 0000,0000,0000,0000,0000,0000,0010,0000
//>>>无符号位右移:整体向右移动n位,就用n个0补位(补到最高位)
int c = 128;//0000,0000,0000,0000,0000,0000,01000,0000
System.out.println(c >>> 2);//32 - 0000,0000,0000,0000,0000,0000,0010,0000
int d = -128;//1111,1111,1111,1111,1111,1111,1000,0000
System.out.println(d >>> 2);//1073741792 - 0011,1111,111,1111,1111,1111,1110,0000
小结:
&、|、^:前后两侧都是数值,此符号为位运算符
&、|、^:前后两侧都是boolean值,此符号为逻辑运算符
左移1位,相当于乘以2
右移1位,相当于除以2
十六进制A-F:10-15
计算机的二进制是以补码形式表示的
补码:正数与原码的形式一样,负数:将该数的绝对值的二进制形式,按位取反再加1。
经验:不用记,灵活运用小括号