逻辑运算符、位运算符、移位运算符、三⽬运算符、运算符的优先级
⼀、逻辑运算符 :逻辑运算符的作⽤是⽤于连接布尔表达式的。
1、& (与,并且)
规律: 只有左右变量同时为true,那么结果才是true,否则就false。
2、| (或,或者)
规律: 只要两边的布尔表达式有⼀边为true,那么结果就为true,只有两边同时为false 的时候,结果才是false。
3、^ (异或)
规律: 只要两边的布尔表达式结果不⼀致,那么结果就为true,如果左右两边的布尔表达式⼀致,那么就为false。
4、! (⾮)
5、&& (短路与\双与)
短路与和单与符号的相同与不同点:
1)相同点: 运算的结果是⼀样的。
2)不同点: 使⽤短路与的时候,如果左边的布尔表达式为false,则不会在运算右边的布尔表达式,从⽽提⾼了效率。使⽤单与的时候,即使发现左边的布尔表达式为false,还是会运算右边的布尔表达式的。
那么有这样⼀个问题:单与的效率⾼于双与?
错,只有左边的布尔表达式为false时,双与的效率才要⾼于单与的。
6、|| (短路或\双或)
短路或与单或的相同点与不同点:
1)相同点:运算的结果是⼀致的。
2)不同点:使⽤短路或的时候,当发现左边的布尔表达式为true时,则不会运算右边的布尔表达式。使⽤单或的时候发现左边的布尔表达式为true,还是会运算右边布尔表达式。
⼆、位运算符:位运算符就是直接操作⼆进制位的,这样效率可能会⾼⼀些,因为计算机就是通过⼆进制对数据进⾏存取的。
1、位运算符与逻辑运算符的区别:
⽤于int类型数据时,就是位运算符。⽤于布尔表达式时就是逻辑运算符。
2、& (与)
3、| (或)
4、^ (异或)
规律: 如果操作数A连续异或同⼀个操作数两次,那么结果还是操作数A。
5、~ (取反)
举例:
分析:
6、应⽤:使⽤异或对图⽚数据进⾏加密。
import java.io.*;
class ImageTest{
public static void main(String[] args) throws Exception{
//到图⽚⽂件
File inFile = new File("e:\\图⽚.jpg");
File outFile = new File("e:\\加密后的图⽚.jpg");
//建⽴数据通道,让图⽚的⼆进制数据流⼊
FileInputStream input = new FileInputStream(inFile);
FileOutputStream output = new FileOutputStream(outFile);
//边读,边把读到的数据异或⼀个数据,再把这个数据写出
int content = 0; //该变量是⽤于存储读取到的数据
// 如果没有到⽂件的末尾,那么继续读取数据,读取到的数据已经存储到content变量中了。
while((content = ad())!=-1){
//加密⽅式与12做异或运算
output.write(content^12);
}
//关闭资源
运算符优先级图片output.close();
input.close();
}
}
7、位运算符可能会出现的笔试题⽬:
1)交换两个变量的值,不准出现第三⽅变量。
class Demo1{
public static void main(String[] args){
int a = 3;
int b = 5;
//⽅式1:定义第三⽅变量。
int temp = a; //3
a = b; //a = 5
b = temp;
//⽅式2:相加法,缺点:两个int类型的数据相加,有可能会出现超出int的表⽰范围。
a = a+b; // a =8
b = a-b; //b = 8 - 5 = 3
a = a-b; // a = 8 - 3 = 5
//⽅式3:可以使⽤异或。缺点:逻辑不清晰。
a = a^b; // a = 3^5
b = a^b; // b = (3^5)^5 = 3
a = a^b; // a = (3^5)^3 = 5 注意:(3^5)和(5^3)是⼀样的
}
}
2)取出⼀个⼆进制数据的指定位数。要求读取该⼆进制数据的低4位
答:
三、移位运算符(也是对⼆进制数进⾏操作的):
1、<<(左移)
规律:⼀个操作数进⾏左移运算的时候,结果就是等于操作数乘以2的n次⽅,n就是左移 的位数.
3<<1 = 3 *2(1) = 6;
3<<2 = 3*2(2) = 12
3<<3 = 3*2(3) = 24
2、>>(右移)
规律:⼀个操作数在做右移运算的时候,实际上就是等于该操作数除以2的n次⽅,n就是右移的位数。
3>>1 = 3 / 2(1) = 1
3>>2 = 3 / 2(2) = 0
3、>>>(⽆符号右移) :
⽆符号右移与右移的区别:进⾏右移运算的时候,如果操作数是⼀个正数,那么左边的空缺位使⽤0补,如果操作数是⼀个负数,那么左边的空缺位使⽤1补。⽽使⽤⽆符号右移的时候,不管是正数还是负数都统⼀使⽤0补。
4、没有⽆符号左移:原因不⽤解释了吧。
5、笔试题⽬:使⽤最⾼的效率算出2乘以8的结果。
答:2<<3 = 2*2(3) = 16; 因为只有⼀个操作数(2),所以效率相对较⾼。
四、三元运算符(三⽬运算符)
1、格式:布尔表达式?值1:值2 ;
2、三元运算符要注意的细节:
使⽤三元运算符的时候,⼀定要使⽤该表达式返回的结果,或者是定义⼀个变量接收该表达式返回的结果。
说简单点就是不能让还有三⽬运算符的语句⾃成⼀句,例如:age>=18?"成年⼈":"未成年⼈";,这种报错。
应该是:result = (age>=18?"成年⼈":"未成年⼈");
或是:System.out.println(age>=18?"成年⼈":"未成年⼈");
五、运算符的优先级:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论