详述逻辑运算符与位运算符及它们的区别
详述逻辑运算符与位运算符区别
逻辑运算符有三种:逻辑且:&& ;逻辑或:|| ;逻辑非:!
备注:Java语言中规定1才为真,0为假;
①逻辑与:&&,在判断时只有符号左右两端同时为真时(即true&&true),该条件才成立!
int a=1, b=1,c=0,d=0; int sum; if(a&&b){ sum=1; } else sum=0; System.out.println(sum);
因此,此代码输出的结果为1。
如果把上述判断条件换为:
if(a&&c){//a&&d,b&&c,b&&d,c&&d sum=1; } else sum=0; System.out.println(sum);
结果输出均为0.
注意:程序在执行(逻辑与)&&的时候,会默认读完符号两边的值,再进行判断。
②逻辑或:||在判断时只要符号左右两端有真时,条件就成立!(即true&&true,true&&false,false&&true三种情况 )
if(a||c){//a||d,b||d,b||c sum=1; } else sum=0; System.out.println(sum);
此代码输出结果为0。
if(c||d){ sum=1; } else sum=0; System.out.println(sum);
则此代码输出结果为0。(即逻辑或中符号两端同时为假,条件才不成立。)
在此强调一点!
int numb1=5,numb2=5; if((numb1=0)==0||((numb2=0)==0){ System.out.println(numb2); }
该代码执行结果numb2的值为5,而不是0!
原因:在if判断语句时,由于中间的逻辑符号是逻辑或||,所以只要有一个为真即该条件成立,则程序不再判断下一个条件。
在此代码中,if语句的条件判断中先识别出是逻辑或,然后从左往右读,先将numb1赋值为0,再判断numb1是否为0,判断结果为numb1为0条件为true,该条件已经成立,不再判断符号右边的条件了,因此numb2并没有被赋值为0,所以输出的结果numb2仍然为5!
③逻辑非:!表示否定意思。
条件判断时通常和等于号(=)连用表示不等于。
例如:
int x=100; if(x!=50)//判断x的值是否不等于50; { System.out.println("NO"); }else{ System.out.println("YES"); }
上述代码中输出结果为:NO
在定义时,将x的值附为100;因此当if语句判断时,x不等于50的条件成立,于是输出“NO”。
位运算符
位运算符有四种:
“按位与”运算符“&”,规则:全1则1,否则为0。
“按位或”运算符“|”,规则:全0则0,否则为1。
“按位非”运算符“~”,规则:遇1则0,遇0则1。
“按位异或”运算符“^”,规则:相同为0,不同为1。
位运算是将数据先转化为二进制数补码形式,再逐位(bit)按规则计算。
样例:
计算7&-5的结果
第一步:byte中的二进制
7的二进制
被除数 除数 商 余数
7 2 3 1
3 2 1 1
1 2 0 1
7的二进制为:00000111
-5的二进制
被除数 除数 商 余数
5 2 2 1
2 2 1 0
1 2 0 1
-5的二进制为:10000101
-5的补码为: 11111010 + 1 = 11111011
00000111&11111011:
00000111
11111011
00000011——>对应十进制的3
逻辑运算符(&&、||)与位运算符(&、|)的区别:
逻辑运算符只能针对boolean类型进行逻辑运算,而位运算还可以对数值进行逻辑运算。
逻辑运算符有短路情况,即前面的表达式可以得到最终结果时,后面的表达式将不被执行。
int a=10; int b=10; if((a=0)==0||(b=20)==20) { System.out.println("b="+b); } /*(a = 0) == 0为true,逻辑或中有一个为真即成立, Java程序不会执行(b = 20)==20,所以结果为10。*/ int x=10; int y=10; if(((x=0)==0)|(y=20)==20) { System.out.println("y="+y); } /*由于要进行按位或运算,所以先计算|左右两边的值,即true|true,而 true在二进制逻辑中为1,由此可知true|true的二进制结果依然为1,但是 二进制1在boolean类型中表示true,所以输出结果为20。*/