date:2020/2/12
逻辑运算符 & | ^ !
&:与 有false就false
|: 或 有true就true
^: 异或 相同为false,不同为true
!: 非 取反
&&:短路与 若左false,判定为false,则不执行右
||: 短路或 若左true,判定为true,则不执行右
注:逻辑运算符左右两边必须是比较表达式,结果也是布尔类型的
与& 和 短路与&& 的区别
1.结果一样
2.短路与&& 具有短路效果,如果左边是false,右边就不执行了
int x = 4;
int y = 3;
System.out.println((++x == 4) && (++y == 3));
System.out.println(x);
System.out.println(y);
输出:x = 5; y = 3;(右边没有执行)
位运算符 & | ^ ~ << >> >>>
· &:与
· |:或
· ^:异或
· ~:取反
· <<:左移
· >>:右移
· >>>:无符号右移
System.out.println(6 & 3); 输出2
System.out.println(6 | 3); 输出7
System.out.println(6 ^ 3); 输出5
System.out.println(~6); 输出-7
解析:
位运算符都是将数值转化为二进制来算的
&与(有0为0):0110 & 0011 = 0010 即 2
|或(有1为1):0110 | 0011 = 0111 即 7
^异或(相同为0,不同为1):0110 ^ 0011 = 0101 即 5
~取反:~0110
00000000 00000000 00000000 00000110 6
11111111 11111111 11111111 11111001 ~6(补码)
11111111 11111111 11111111 11111000 反码
10000000 00000000 00000000 00000111 原码 即-7
<< 左移,最高位丢弃,右边补0
>> 右移,最高位是0,补0,最高位是1,补1
对于正数来说,左移几位就是乘以2的几次幂,右移就是除以2的几次幂
负数要变成补码才能运算,然后再变成原码,左移也是左移几位就是乘以2的几次幂,右移需要看具体操作
不管左移右移,都不改变符号
负数左移 -12 << 1
10000000 00000000 00000000 00001100 -12
11111111 11111111 11111111 11110011 反码
11111111 11111111 11111111 11110100 补码
11111111 11111111 11111111 11101000 左移一位(补码)
11111111 11111111 11111111 11100111 反码
10000000 00000000 00000000 00011000 原码 即-24
负数右移 -12 >> 3
10000000 00000000 00000000 00001100 -12
11111111 11111111 11111111 11110011 反码
11111111 11111111 11111111 11110100 补码
11111111 11111111 11111111 11111110 右移3位(补码)
11111111 11111111 11111111 11111101 反码
10000000 00000000 00000000 00000010 原码 即-2
注:正数右移到最后等于0,负数右移到最后等于-1
>>>无符号右移,和有符号右移>>不一样,高位全补0
三目运算符 (expr1) ? expr2 : expr3
expr1是比较表达式,若true,选择expr2,若false,选择expr3
Q:找出变量中的最大值
int q = 10;
int w = 20;
int e = 30;
int temp = (q > w) ? q : w;
int max = (temp > e) ? temp : e;
System.out.println(max);
选择结构语句 if switch
第一种
if(a > 1) {
System.out.println(a);
}
第二种
if(a > 1) {
System.out.println(a);
} else {
System.out.println("0");
}
第三种
if(a > 1) {
System.out,println(a);
} else if(a > 0) {
System.out.println("0");
} else {
System.out,println("1");
}
switch(a) {
case 1:
System.out.println("1");
break;
case 2:
System.out.println("2");
break;
............
default:
System.out.println(n);
break;
}