逻辑运算符
逻辑运算符包括:& &&(并且) | ||(或者) !(取反) ^(异或)
其运算结果都是布尔类型即true或false
&:两端都是true,则结果为true;只要有一端为false则为false
|:两段的表达式只要有一端为true其结果就为true,只有当两端都为false时才是false
!:取反,即false变true,true变false
^:相同为true,不同为false
其大概用法如下:
public class MyTest {
public static void main(String[] args) {
int a=10;
int b=30;
boolean flag=a>b&a<b;
System.out.println(flag);
boolean flag1=a>b|a<b;
System.out.println(flag1);
System.out.println(!true);
System.out.println(!false);
System.out.println(true^true);
System.out.println(false^false);
System.out.println(true^false);
}
}
**& &&与| || **的区别:
二者的运算结果是没有区别的,但是单个逻辑运算符两边的表达式都会运行,但是两个运算符在一起时在某些情况下右端的表达式就不会执行;
&&当左端为false时,右端的表达式就不会执行;||左端为true时,右端的表达式就不会执行
位运算符
直接对二进制补码进行运算,运算效率高
位运算符有:&(与),|(或),^(异或) , ~(按位取反) , <<(左移) ,>>(右移) ,>>>(无符号右移)
&:把给定的数字转成补码进行运算,“有0则0”原则
eg: 0 0000011
0 0000100
& “有0则0”
0 0000000
|:也是对给定数字的补码进行运算,但原则是“有1则1”,类比上述例子;
^:对给定数字的补码进行运算,原则是“相同则0,不同则1”
~:按位取反,0变1,1变0,符号位也包括在内进行取反
eg:~9:
原码:00001001
反码:00001001
补码:00001001
“0变1,1变0”
按位取反 :1 1110110 补码
再推回原码
1 1110110 补码
-1
1 1110101 反码
取反
1 0001010 原码 为-10
<< (左移)空位补0 >> (右移) 正数补0负数补1;>>>(无符号右移) 空位都补0不管正负;
有几个结论可以直接记下来用:
- 一个数被另一个数位异或两次,该数不变;
- 一个数与自己本身位异或结果为0;
- <<:把<<左边的数据乘以2的移动次幂;比如:10<<3就等于10×2^3=80;
- 而>>:把>>左边的数据除以2的移动次幂;比如40>>3就等于40÷(2^3) =5;
如何进行值交换
值交换的思想比较重要,会在今后的学习中经常遇到
我们掌握使用其中一种就好,下面介绍采用中间变量的方法来进行值交换
我们用具体代码来说明:
public class MyTest2 {
public static void main(String[] args) {
int a=20;
int b=50;
int t;//创建一个中间变量
t=a;//将a的值先赋给t,暂时存储起来
a=b;//此时a的值你可以理解为空的,这时将b的值赋给a
b=t;//b的值赋给a后b也变为“空的”,这时将a存储在t中的值赋给b实现值交换
System.out.println(a);
System.out.println(b);
}
}
三目元算符
其表达形式是:表达式?结果1:结果2
当表达式为true时,返回结果1;当表达式为false时,返回结果2
用代码来简单应用一下:
public class MyTest3 {
public static void main(String[] args) {
int a=10;
int b=30;
int max=a>b?a:b;
System.out.println(max);
}
}