逻辑运算符有三种类型:
运算符 用法 含义
&& | op1&&op2 | 逻辑与 |
|| | op1||op2 | 逻辑或 |
! | !op | 逻辑非 |
运算规则为:
op1 | op2 | op1&&op2 | op1||op2 | !op1 |
true | True | true | true | false |
True | False | false | true | false |
False | True | false | true | true |
False | False | false | false | true |
简而言之:&& 全真则真 全假则假
|| 有真则真 全假才假
! 真变假 假变真
位运算符 :位运算是将数据先转化为二进制数补码形式,再逐位(bit)按规则计算。
“按位与”运算符“&”,规则:全1则1,否则为0
a 00000000 00000000 00000000 00000111
b & 10000001 10100101 11110011 10101011
c 00000000 00000000 00000000 00000011
“按位或”运算符“|”,规则:全0则0,否则为1。
a 00000000 00000000 00000000 00000111
b | 10000001 10100101 11110011 10101011
c 10000001 10100101 11110011 10101111
“按位非”运算符“~”,规则:遇1则0,遇0则1。
a ~ 00000000 00000000 00000000 00000111
b 11111111 11111111 11111111 11111100
“按位异或”运算符“^”,规则:相同为0,不同为1。
a 00000000 00000000 00000000 00000111
b ^ 10000001 10100101 11110011 10101011
c 10000001 10100101 11110011 10101100
逻辑运算符(&&、||)与位运算符(&、|)的区别:
①逻辑运算符只能针对Boolean(布尔)类型进行逻辑运算,而位运算还可以对数值进行逻辑运算
例如:用逻辑运算符进行位运算将会报错
public class HelloWorld{
public static void main(String [] args){
System.out.println(1 && 2);
}
}
用位运算符却仍然可以对数值进行逻辑运算
public class HelloWorld{
public static void main(String [] args){
System.out.println(1==1 & 2==2);
}
}
②逻辑运算符有短路情况,即前面的表达式可以得到最终结果时,后面的表达式将不被执行。
例如:
public class HelloWorld{
public static void main(String [] args){
int a = 10;
int b = 10;
if (((a = 0) == 0) || ((b = 20) == 20)) {
System.out.println("b=" + b);
}
int x = 10;
int y = 10;
if (((x = 0) == 0) | ((y = 20) == 20)) {
System.out.println("y=" + y);
}
}
}
输出结果为
由于逻辑运算符的短路性,在判断出(a = 0) == 0) 为真时,由于“||”运算有真则真的特性,结果已经可以判断为真,故之后对b的赋值不再运行,所以b仍然为10;
而在第二个if表达式中,由于位运算符的运算方式———将数据先转化为二进制补码形式,所以y已经转化并且运行了赋值,最后再通过if表达式判断式子真假,因此y的值被改变为20.