逻辑运算符主要有三个: && 、|| 、 !
逻辑运算符的返回值和操作数都是boolean类型。
&& 中两个操作数都为 true,结果才为 true,否则为 false。 其中 & 的操作数为 boolean 类型时也可以表示逻辑运算。
public static void main(String[] args) {
int a = 10, b = 20, c = 30;
System.out.println("&&的结果:"+ (a < b && b < c));
System.out.println("&&的结果:"+ (c < a && a < b));
System.out.println("&的结果:"+ (c < a & a < b));
}
注意:&& 遵守短路求值,也就是只要第一个操作数为 false,就直接返回 false,不再求第二个操作数。而 & 则不遵守短路求值。
证明:
System.out.println("&&的结果:" + (c < a && 4 / 0 == 0));
System.out.println("&的结果:" + (c < a & 4 / 0 == 0));
第一行代码没有报错是因为它只求了第一个表达式结果是 false ,然后直接就返回了 false ,而没有进行下一个表达式,所以除数为0 时也没有报错。而使用 & 时,不会短路求值,两个操作数都求值了,所以出现了除数为0的异常。一般不会使用&,推荐使用&&。
|| 中两个操作数都为 false,结果为 false,否则为 true。也就是只要有一个 true,结果就为 true。
int a = 10, b = 20, c = 30;
System.out.println("||的结果:" + (a < b || b < c));
System.out.println("||的结果:" + (c < a || b < a));
System.out.println("||的结果:" + (c < b || a < b));
System.out.println("|的结果:" + (c < b || a < b));
注意:同 && 逻辑与一样,|| 也遵守短路求值,如果第一个表达式结果为true,整体结果就为true,不用再计算第二个表达式。而 | 不遵守短路求值。
逻辑非为单目运算符,只有一个操作数。操作数为 true,结果为 false ;操作数为 false,结果为 true。
int a = 10, b = 20;
System.out.println(a < b);
System.out.println(!(a < b));
位运算符主要有四个:& | ~ ^
Java中对数据操作的最小单位是二进制,位操作表示按二进制位运算,就是按照二进制位的每一位依次进行计算。
如果两个二进制位都是1,则结果为1,否则为0。
public static void main(String[] args) {
int a = 10, b = 20;
System.out.println(a & b);
}
如果两个二进制位都是0,则结果为0,否则为1。
int a = 10, b = 20;
System.out.println(a | b);
按位取反不单单是0变1,而是必须知道该二进制的补码,这样才能给其按位取反。因为在内存中二进制数是以补码的形式存放的,而正数、负数的补码是不一样的。正数的补码、反码都是其本身;负数的反码是在原码的基础上符号位不变,其它各位求反,补码是反码末位加1.
举例:
9:
原码:0000 1001
反码:0000 1001
补码:0000 1001
-3:
原码:1000 0011(最高位是符号位)
反码:1111 1100(最高位不变,其他为取反)
补码:1111 1101(最后一位加1)
对9按位取反步骤:
对-3按位取反步骤:
总结:
按位取反步骤是:先得到该数的补码,对其补码取反,然后将其补码转为原码,按照要求的进制输出。
规律:
如果两个数字的二进制位上的0(或1)相同,则结果为0;如果不同,则结果为1.
int a = 10;
int b = 20;
System.out.println(a ^ b);
移位运算符有三个:<< >> >>>
左移 << : 最左侧位不要,最右侧位补0。
右移 >> : 最右侧位不要,最左侧位补符号位(正数补0,负数补1)。
无符号右移 >>> : 最右侧位不要了,最左侧位补0。
用法:
1. 位1的个数
2. 2的幂
3. 只出现一次的数字