2.5.逻辑运算符
&、|、^、&&、||、!
参与逻辑运算的数据类型必须是boolean类型,
并且逻辑运算返回的结果也是boolean类型。
* &,与
结论:只有两边都为true,那么返回的结果才为true。
只要两边有一个为false,那么返回的结果就是false。
辅助记忆:小明与小红来一趟办公室。
* |,或
结论:只要两边有一个为true,那么返回的结果就是true。
只有两边都为false,那么返回的结果才为false。
辅助记忆:小明或小红来一趟办公室。
* ^,异或
结论:两边相同则返回false,两边不同则返回true。
-----------以上三个作为了解,几乎不用----------
* &&,短路与
&和&&相同点:
返回的结果都是一模一样,结论一模一样。
&和&&不同点:
&&:如果左边表达式的结果为false,右边表达式永远不会执行,直接返回左侧表达式的结果。
&:即便左边表达式的结果为false,右边表达式依旧会执行,并且返回左侧表达式的结果。
补充:如果左侧表达式的结果为true,那么&和&&的右侧表达式都会执行。
补充:现实开发中使用短路与(&&)非常多,因为短路与(&&)效率高!
* ||,短路或
|和||相同点:
返回的结果都是一模一样,结论一模一样。
|和||不同点:
||:如果左边表达式的结果为true,右边表达式永远不会执行,直接返回左侧表达式的结果。
|:即便左边表达式的结果为true,右边表达式依旧会执行,并且返回左侧表达式的结果。
补充:如果左侧表达式的结果为false,那么|和||的右侧表达式都会执行。
补充:现实开发中使用短路或(||)非常多,因为短路或(||)效率高!
* !,非,取反的意思。属于一元运算符。
结论:取反的意思。
!true --> false, !false --> true
* 随堂练习:
1、判断一个数是否在4(包含)~6(不包含)之间;
步骤实现:
a)通过Scanner获取一个整数,假设该整数为num
b)判断num是否在[4, 6)之间。
数学:4 <= num < 6 --> 不同数据类型之间无法做比较
编程:4 <= num && 6 > num
2、判断一个数是否在4(不包含)~6(包含)之外;
实现步骤:
a)通过Scanner获取一个整数,假设该整数为num
b)判断num是否在(4, 6]之外。
编程:num < 4 || num >= 6
补充:[4, 6) --> 该范围表示:4(包含)到6(不包含)之间的整数
[4.0, 6.0) --> 该范围表示:4(包含)到6(不包含)之间的小数
[]代表包含关系。()代表不包含关系
2.6位运算(了解)
&、|、^、~、>>,>>>,<<
注意:&、|、^既可以是逻辑运算符,也可以是位运算。
&、|、^、~
* &,与
结论:如果位都为1,那么结果就为1,反之就为0。
7 0000-0000 0000-0000 0000-0000 0000-0111
6 0000-0000 0000-0000 0000-0000 0000-0110
&-------------------------------------------
0000-0000 0000-0000 0000-0000 0000-0110 --->6
* |,或
结论:如果其中一个位为1,那么结果就为1,反之就为0。
7 0000-0000 0000-0000 0000-0000 0000-0111
6 0000-0000 0000-0000 0000-0000 0000-0110
|-------------------------------------------
0000-0000 0000-0000 0000-0000 0000-0111 --->7
* ^异或
结论:对m连续异或n两次,返回的结果依旧为m。
n^m^n --> m m^n^n --> m
使用场合:
a)用于加密。
加密:把图片和一个数值(m)做异或运算,然后保存在电脑上。
解密:把加密的图片和数值m继续异或一次,得到就是解密后的图片。
b)交换两个变量的值
方式三:使用异或运算实现。
优点:效率最高。
缺点:不好理解。
* ~,非
结论:位取反。1变为0,0变为1.
7 0000-0000 0000-0000 0000-0000 0000-0111
^-------------------------------------------
1111-1111 1111-1111 1111-1111 1111-1000
>>,>>>,<<
* <<,左移
作用:对m左移n位,等效于:m*2^n
注意点:左移移动了n位,那么低位就补n个零。
使用场合:如果想对一个数乘以2,那么最高效的方式就是左移一位。
* >>,右移
作用:对m右移n位,等效于:m/2^n
注意点:对正数右移之后,高位永远补0;
对负数右移之后,高位永远补1。
使用场合:如果想对一个数除以2,那么最高效的方式就是右移一位。
* >>>,无符号右移
注意点:无论是对正数还是负数无符号右移,高位都永远补0
2.7 运算符优先级
不需要去刻意的记这些优先级,表达式里面优先使用小括号来组织!!
2.8三元运算符(三目运算符)
语法:条件表达式 ? 表达式1 : 表达式2;
需求:获取两个数中的最大值。
代码例子:
int num1 = 30, num2 = 20;
// 使用三元运算符
int max = num1 > num2 ? num1 : num2;
System.out.println("num1和num2是最大值为:" + max);