详述逻辑运算符与位运算符区别

逻辑运算符有三种:逻辑且:&& ;逻辑或:|| ;逻辑非:!

备注: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。*/