目录
一、逻辑运算符
只能对布尔类型的值做运算,并且返回的值为布尔类型。
运算符 | 名称 | 作用 |
& | 逻辑与 | 都真为真,一假则假 |
&& | 短路与 | 都真为真,一假则假 |
| | 逻辑或 | 都真、一真为真,全假则假 |
|| | 短路或 | 都真、一真为真,全假则假 |
! | 逻辑非 | 真假取反 |
^ | 逻辑异或 | 都真、都假为假,一真一假为真 |
1.&逻辑与、&&短路与的区别
案例1:分别让&、&&运算将结果赋值给result,检查后半段运算是否执行。
//&逻辑与、&&短路与的区别
class operator1{
public static void main(String[] args) {
//&逻辑与、&&短路与的区别
boolean front = false;
int num1 = 168;
boolean result1 = front & ++num1 > 8; //使用&运算并赋值给result1
System.out.println(" result = front & ++num1");
System.out.println("boolean = " + result1 + "\nnum = " + num1 + "\n");
int num2 = 168;
boolean result2 = front && ++num2 > 8; //使用&&运算并赋值给result2
System.out.println(" result = front && ++num2");
System.out.println("boolean = " + result2 + "\nnum = " + num2);
}
}
结果:&、&&的运算返回结果一致,都为false,但是&&没有运算右边的方程式,num仍然为168
结论:&、&&计算返回结果都是一样的,但是&&一经检测到第一个布尔为假,则结束计算并返回结果,&则刚好相反。
优先考虑使用短路与&&,可减少运算量;不得不使用逻辑与&时再使用。
二、位运算符
运算符 | 名称 | 作用 |
<< | 左移 | 二进制数位的左移操作,空缺位用0补齐 |
>> | 右移 | 二进制的右移操作,空缺位使用与符号位相同的0或1补齐(负数为1、正数为0) |
>>> | 无符号右移 | 二进制的右移操作、空缺位用0补齐 |
& | 与运算 | 同位都是1,那这一位为1,否则为0 |
| | 或运算 | 至少有一个1则为1,否则为0 |
^ | 异或运算 | 位不同位1,相同为0 |
~ | 取反运算 | 位取反:位上的1和0切换 |
<<、>>、>>>是2进制位的左右移动;&、|、^为位的逻辑运算,对应的0为假,1为真。
~则是将二进制每个位上的0和1对调。
1.异或^运算符实践
案例2:使用异或运算符实现变量数值交换
//使用^异或运算符交换数值变量的值
int ii = 98;
int io = 65;
ii = ii ^ io; //将ii与io的差异值(相同的位用0表示,不同的位用1表示)赋值给ii
io = ii ^ io; //将原ii值赋值给io:io和ii都为0的位再次与0计算依然为0;io与ii都为1的位再次与0计算依然为1;io为0 ii为1的位再次与1计算结果为1实现io到ii的转变;io为1(ii为0)的位再次与1计算结果为0实现io到ii的转变
ii = ii ^ io; //将原io值赋值给ii:此时ii为ii与io的位差异值,再次与原ii值运算得到原io值
System.out.println("ii =" + ii);
System.out.println("io =" + io);
结果:ii和io的值互换了。
结论:ii(98)^io(65)的结果与65再次进行^运算得到的结果为98;ii(98)^io(65)的结果与98再次进行^运算得到的结果为65
三、三元运算符
三元运算符?:
(布尔值)?返回值:返回值
| |
真 假
1.三元运算?实践
案例3:使用三元运算?找出最大值。
//使用三元运算?找出最大值。
int bb = 88;
int ss = 66;
int ll = 99;
int max = (bb > ss)?bb:ss;
max = (max > ll)?max:ll;
System.out.println("最大值为" + max);
结果:正确得到最大值
结论:?三元运算符可以实现二选一来输出值。