逻辑运算符:&&,||,!
public class Demo1{
public static void main(String[] args) {
boolean A = true;
boolean B = false;
System.out.println(" A && B = " + (A&&B) );
System.out.println(" A || B = " + (A||B) );
System.out.println(" !A = " + !A );
}
}
结果如下:
A && B = false
A || B = true
!A = false
短路运算
&&和||的短路运算,是指如果前面的判断条件已经明确结果则不执行后面的判断
例如:
public class Demo1{
public static void main(String[] args) {
int A = 10;
boolean B = (A<9) && (A++<20);
System.out.println("B = " + B);
System.out.println("A = " + A);
boolean C = (A<9) || (--A == 9);
System.out.println("C = " + C);
System.out.println("A = " + A);
}
}
结果如下:
B = false
A = 10
C = true
A = 9
当判断到(A<9)为假时,将不再执行后面的运算判断,即(A++<9)没有被执行
&、&&的区别
&&执行短路运算,效率比&高,只要&&左边存在false,右边不执行;
&物理左边是false还是true,右边都执行。
注:同理可得|和||的区别
位运算符:&,|,^,~,>>,<<,>>>
注:以下数据类型默认为byte-8位
&:与运算,即如果对应位都是1得1,否则为0
例如:
0010 1101
& 0110 0111
0010 0101
| :或运算,即如果对应位都是0为0,否则为1
例如:
0010 1101
| 0110 0111
0110 1111
^:异或运算,即对应位相同则为0,不相同则为1
例如:
0010 1101
^ 0110 0111
0100 1010
~:取反运算,即原位为1,取反后为0,反之亦然
A =0011 1010
~A=1100 0101
<<:表示将操作数左移一位,不分正负数,并在低位补0
byte a = 8;
System.out.println(a<<2);
正数a=8
8的二进制补码:0000 1000
a<<2,即为8的二进制补码左移两位后得到:0010 0000
0010 0000转换为十进制:a<<2 = 32
左移运算符<<可看作是操作数乘以n次2
如上a<<2可以看作为a*2*2,但是使用左移运算符是比直接用*运算符要快的,因为这样是直接对底层二进制数进行运算,效率更高
!!注意二进制数范围(byte为-128——127)
>>:表示将操作数右移一位,如果操作数为正数,高位补0;负数则高位补1
——————————————————————右移运算符>>可看作是操作数除以n次2
正数a=8
8的二进制补码:0000 1000
a>>2,即为8的二进制补码左移两位后得到:0000 0010
0010 0000转换为十进制:a>>2 = 2
负数a=-20
-20的二进制原码为:1001 0100
反码为:1110 1011(除最高位符号位,其余位取反)
补码为:1110 1100(反码+1)
右移两位后的补码为:1111 1011
反码为:1111 1010
原码为:1000 0101
a>>2结果为:-5
>>>:表示无符号右移,也称为“逻辑右移”,即若操作数为正,则高位补0;若操作数为负,则右移后高位同样补0
正数a>>>2的结果与a>>2的结果是一样的
负数a=-24
注:以下数据类型默认为int 32位
-24原码:10000000 00000000 00000000 00011000
反码:11111111 11111111 11111111 11100111
补码:11111111 11111111 11111111 11101000
右移2位:0011111111 11111111 11111111 111010
a>>>2=1073741818