深度理解运算符(深度理解二进制与、或、非、异或、取反)

运算符

运算符:是一种特殊的符号,用以表示数据的运算、赋值和比较等。
表达式:用运算符连接起来的式子

在Java中,一共有38个运算符。
在这里插入图片描述

一、运算符的分类

  • 按照功能划分:
分类运算符
算术运算符+-*/%++--
赋值运算符=+=-=*=/=%=
关系运算符>>=<<===!=
逻辑运算符&、`
条件运算符(条件表达式)?结果1:结果2;
位运算符(了解)&、`
  • 按照操作数个数划分:
分类运算符例子
一元(单目)运算符++、–、!i++、–i
二元(双目)运算符+、-、*、/、%、>、<=等a+b、10>=9
三元(三目)运算符表达式1?表达式2:表达式3age>=18?“成年”:“未成年”

二、算术运算符

算术运算符符号解释
+加法运算,字符串连接运算,正号
-减法运算,负号
*乘法运算
/除法运算,整数/整数结果还是整数
%求余运算,余数的符号只看被除数
++--自增自减运算

System.out.println(5%2);//1
System.out.println(5%-2);//1
System.out.println(-5%2);//-1
System.out.println(-5%-2);//-1
//商除数 + 余数 = 被除数
//5%-2 ==>商是-2,余数是1 (-2)
(-2)+1 = 5
//-5%2 ==>商是-2,余数是-1 (-2)*2+(-1) = -4-1=-5

“+”号的两种用法

  • 第一种:对于+两边都是数值的话,+就是加法的意思

  • 第二种:对于+两边至少有一边是字符串得话,+就是拼接的意思

自加自减运算

理解:++ 运算,变量自己的值加1。反之,-- 运算,变量自己的值减少1,用法与++ 一致。

  • 单独使用

    • 变量在单独运算的时候,变量前++和变量后++,变量的是一样的;

    • 变量前++ :例如 ++a

    • 变量后++ :例如 a++

  • 复合使用

    • 其他变量放在一起使用或者和输出语句放在一起使用前++后++就产生了不同。
    • 变量前++ :变量先自身加1,然后再取值。
    • 变量后++ :变量先取值,然后再自身加1。

小结:

  • ++在前,先自加,后使用;
  • ++在后,先使用,后自加。

public static void main(String[] args){
int i = 1;
int j = i++;
int k = i++ * ++j + --i * j–;
System.out.println("i = " + i);//2
System.out.println("j = " + j);//1
System.out.println("k = " + k);//8
}

三、赋值运算符

注意:所有的赋值运算符的=左边一定是一个变量

赋值运算符符号解释
=将符号右边的值,赋值给左边的变量
+=将符号**左边的值右边的值进行相加操作,最后将结果赋值给左边的变量**
-=将符号**左边的值右边的值进行相减操作,最后将结果赋值给左边的变量**
*=将符号**左边的值右边的值进行相乘操作,最后将结果赋值给左边的变量**
/=将符号**左边的值右边的值进行相除操作,最后将结果赋值给左边的变量**
%=将符号**左边的值右边的值进行取余操作,最后将结果赋值给左边的变量**

扩展赋值运算符

short s = 3;
// s = s + 4; 代码编译报错,因为将int类型的结果赋值给short类型的变量s时,可能损失精度
s += 4; // 代码没有报错
//因为在得到int类型的结果后,JVM自动完成一步强制类型转换,将int类型强转成short
System.out.println(s);
int j = 1;
j += ++j * j++;//相当于 j = j + (++j * j++);
System.out.println(j);//5

扩展赋值运算符在将最后的结果赋值给左边的变量前,都做了一步强制类型转换

四、关系运算符/比较运算符

比较运算符,是两个数据之间进行比较的运算,运算结果一定是boolean值true或者false

关系运算符符号解释
<比较符号左边的数据是否小于右边的数据,如果小于结果是true。
>比较符号左边的数据是否大于右边的数据,如果大于结果是true。
<=比较符号左边的数据是否小于或者等于右边的数据,如果大于结果是false。
>=比较符号左边的数据是否大于或者等于右边的数据,如果小于结果是false。
==比较符号两边数据是否相等,相等结果是true。
!=不等于符号 ,如果符号两边的数据不相等,结果是true。

五、逻辑运算符

逻辑运算符,是用来连接两个布尔类型结果的运算符(!除外),运算结果一定是boolean值true或者false

逻辑运算符符号解释符号特点
&与,且falsefalse
`truetrue
^异或相同为false,不同为true
!falsetrue,非truefalse
&&双与,短路与左边为false,则右边就不看
``双或,短路或左边为true,则右边就不看

&&和&区别,||和|区别

短路与,短路或运算符左边表达式结果可以确定最终结果,则运算符右边表达式不再进行运算,效率高

  • **&&&**区别:

    &&&结果一样,&&有短路效果,左边为false,右边不执行;&左边无论是什么,右边都会执行。

  • **|||**区别:

    |||结果一样,||有短路效果,左边为true,右边不执行;|左边无论是什么,右边都会执行。

int x = 1;
		int y = 1;
		//x==2 ,x++  false  x = 2 左边为false
		//右边继续
		//++y  y==2  y=2  y==2成立  右边为true
		//false & true 结果false
		if(x++==2 & ++y==2){
			x =7;
		}
		System.out.println("x="+x+",y="+y);
//x=2,y=2
int x = 1,y = 1;
		//x==1,x++  左边为true,x=2
		//因为是逻辑与,右边继续  
		//++y, y==1  y=2 右边为false
		//条件true | false,最终为true
		if(x++==1 | ++y==1){
			x =7;
		}
		System.out.println("x="+x+",y="+y);//x=7,y=2

面试题:

        boolean x = true;
		boolean y = false;
		short z = 42;
		
		//如果if((z++==42)&&(y==true))条件成立,执行z++,不成立,就不执行z++
		//左边的条件:z==42,z++  z==42成立,z++变成43
		//中间虽然是短路与,因为左边现在是true,右边还要看
		//右边 y==true   不成立
		//true && false 结果为false
		if((z++==42)&&(y==true))	z++;
	
		//左边为x=false,赋值  结果就为false
		//中间虽然为短路或,因为左边是false,右边继续看
		//++z,z==45  ++z变成44,z==45是否成立,不成立
		//false || false  结果为false
		if((x=false) || (++z==45))  z++;

		System. out.println("z="+z);//44

六、条件运算符

条件运算符格式:

条件表达式?结果1:结果2

条件运算符计算方式:

  • 条件判断的结果是true,条件运算符整体结果为结果1,赋值给变量。
  • 判断条件的结果是false,条件运算符整体结果为结果2,赋值给变量。

int i = (1==2 ? 100.0 : 200);
System.out.println(i);//200.0

当两个不同的数据类型作为结果时自动转为较大的那个数据类型

七、 位运算符

位运算符符号解释
&按位与,当两位相同时为1时才返回1
``
~按位非,将操作数的每个位(包括符号位)全部取反
^按位异或。当两位相同时返回0,不同时返回1
<<左移运算符
>>右移运算符
>>>无符号右移运算符
  • 位运算符的运算过程都是基于补码运算,但是看结果,我们得换成原码,再换成十进制看结果
  • 从二进制到十进制都是基于原码
  • byte,short,char在计算时按照int类型处理
  • 位运算直接对二进制进行位移操作实现数值运算,所以运算效率高
  1. 左移:<<
    运算规则:左移几位就相当于乘以2的几次方

    注意:当左移的位数n超过该数据类型的总位数时,相当于左移(n-总位数)位

    byte,short,char在计算时按照int类型处理

-3<<4 类似于 -32的4次= -316 = -48
在这里插入图片描述

  1. 右移:>>
    快速运算:类似于除以2的n次幂,如果不能整除,向下取整

-69>>4 类似于 -69/2的4次 = -69/16 = -5

在这里插入图片描述

  1. 无符号右移:>>>
    运算规则:往右移动后,左边空出来的位直接补0,不看符号位

    正数:和右移一样

    负数:右边移出去几位,左边补几个0,结果变为正数

69>>>4 类似于 69/2的4次 = 69/16 =4

在这里插入图片描述

-69>>>4 结果:268435451

在这里插入图片描述

  1. 按位与:&
    运算规则:对应位都是1才为1
    1 & 1 结果为1
    1 & 0 结果为0
    0 & 1 结果为0
    0 & 0 结果为0

-9&7 = 7
在这里插入图片描述

  1. 按位或:|
    运算规则:对应位只要有1即为1
    1 | 1 结果为1
    1 | 0 结果为1
    0 | 1 结果为1
    0 | 0 结果为0

-9|7 结果: -9
在这里插入图片描述

  1. 按位异或:^
    运算规则:对应位一个为1一个为0,才为1
    1 ^ 1 结果为0
    0 ^ 1 结果为1
    0 ^ 0 结果为0

-9^7 结果为-16

在这里插入图片描述

  1. 按位取反
    运算规则:
    ​ ~0就是1
    ​ ~1就是0

~-9 结果:8
在这里插入图片描述

八、 运算符优先级

在这里插入图片描述
提示说明:
(1)表达式不要太复杂
(2)先算的使用()

大体的排序:算术 > 位 > 比较 > 逻辑 > 三元 > 赋值

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力奋斗的JAVA小余

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值