5、运算符
运算符是一种特殊符号,用以表示数据的运算,赋值,比较等
一、算术运算符(二元运算符)
符号 | 意义 |
---|---|
+ | 正号 |
- | 负号 |
+ | 加号 |
- | 减号 |
* | 乘 |
/ | 除(取除数):1/2 = 0; 1.0/2 = 0.5; |
% | 取余(取模):其本质是a%b = a - a/b*b |
二、自增、自减运算符
符号 | 意义 |
---|---|
++a(--a) | 前自增(自减):先运算,后取值 |
a++(a--) | 后自增(自减):先取值,后运算 |
同:++a和a++的作用都相当于a = a + 1;
异:b = ++a,先运算后取值,系统使用临时变量①temp = a;②a = a + 1;③b = a + 1;
b = a++,先取值后运算,系统运算过程①b = a;②a = a + 1;
三、比较运算符
比较运算的结果为boolean型
符号 | 意义 |
---|---|
== | 相等 |
!= | 不等于 |
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
instanceof | 判断数据类型 |
(1)等于不等于,适用于参加基本数据类和引用型数据类型,基本数据类型比较值,引用数据类型比较地址
(2)其他适合整型,浮点型和字符型
四、逻辑运算符
符号 | 意义 |
---|---|
&& | 逻辑与(短路与) |
|| | 逻辑或(短路或) |
! | 逻辑非 |
& | 非短路与 |
| | 非短路或 |
什么是短路?
以&和&&为例
-
当使用&时,无论第一个表达式是否为false时,仍要去对第二个表达式进行判断
-
当使用&&时,当第一个表达式为false时,则不会判断第二个表达式,直接输出结果
通常将这种在逻辑表达式中从左端的表达式即可推断出整个表达式的值为“短路”,
五、赋值运算符
复合运算符会进行类型的转换
符号 | 意义 |
---|---|
= | 基本赋值 |
+= | a+=b; a=a+b; |
-= | a-=b; a=a-b; |
*= | a*=b; a=a*b; |
/= | a/=b; a=a/b; |
六、三元运算符
格式:条件式 ? 表达式1 : 表达式2;
意义:若条件表达式为true,运算结果为表达式1
七、位运算符
(1)位运算符除了按位与(&)按位或(|)外,只能处理整数的操作数
(2)位运算是完全针对位方面的操作,整形数据在内存中以二进制的形式表示
- 如int型变量7的二进制表示是:00000000 00000000 00000000 00000111
原码,反码,补码是什么?
(3)要进行位运算,需要了解原码,反码和补码
①左边最高位是符号位,最高位是0表示正数,最高位是1表示是负数
②正数原码,反码,补码都一样
③负数反码 = 原码符号位不变,其他位取反
④负数补码 = 它的反码 + 1
⑤0的反码,补码都是0
⑥Java的数都是有符号的
⑦计算机运算时,以补码的方式来运算,运算结果看原码
符号 | 意义 |
---|---|
& | 按位与 |
| | 按位或 |
~ | 按位非 |
^ | 按位异或 |
/*2&3
推导过程:
(1)2的补码:(00000000 00000000 00000000 00000010)补
(2)3的补码:(00000000 00000000 00000000 00000011)补
(3)按位与&:(00000000 00000000 00000000 00000010)补,符号位为0,为正数,三码合一
得到结果:(00000000 00000000 00000000 00000010)原,结果为2
*/
System.out.println(2&3);//2
/*~-2
推导过程:
(1)-2的原码:(10000000 00000000 00000000 00000010)原
-2的反码:(11111111 11111111 11111111 11111101)反
-2的补码:(11111111 11111111 11111111 11111110)补
(2)按位非~:(00000000 00000000 00000000 00000001)补,符号位为0,为正数,三码合一
(3)按位非的原码:(00000000 00000000 00000000 00000001)原,结果为1
*/
System.out.println(~-2);//1
/*~2
推导过程:
(1)2的原码:(00000000 00000000 00000000 00000010)补
(2)按位非~:(11111111 11111111 11111111 11111101)补
(3)对应的反码:(11111111 11111111 11111111 11111100)反
(4)对应的原码:(10000000 00000000 00000000 00000011)原,结果为-3
*/
System.out.println(~2);//-3
/*2|3
推导过程:
(1)2的补码:(00000000 00000000 00000000 00000010)补
(2)3的补码:(00000000 00000000 00000000 00000011)补
(3)按位或:(00000000 00000000 00000000 00000011)补,符号位为0,为正数,三码合一
(4)对应的原码:(00000000 00000000 00000000 00000011)原,结果为3
*/
System.out.println(2|3);//3
/*2^3
推导过程:
(1)2的补码:(00000000 00000000 00000000 00000010)补
(2)3的补码:(00000000 00000000 00000000 00000011)补
(3)按位异或:(00000000 00000000 00000000 00000001)补,符号位为0,为正数,三码合一
(4)对应的原码:(00000000 00000000 00000000 00000001)原,结果为1
*/
System.out.println(2^3);//1
八、移位运算符
符号 | 意义 |
---|---|
>> | 算数右移:低位溢出,符号位不变,并用符号位补空缺的高位 |
<< | 算数左移:符号位不变,低位补0 |
>>> | 逻辑右移:低位溢出,高位补0 |
例子:
1 >> 2; //0
1 << 2; //1*2*2=4
4 << 3; //4*2*2*2=32
15 >>2; //15/2/2=3
八、运算优先级
符号 | 意义 |
---|---|
() | 括号 |
++、--、! | 一元运算符 |
*、/、% | 乘除 |
+、- | 加减 |
>>、<<、>>> | 位运算符 |
<、>、<=、>= | 比较运算符 |
==、!= | 等于不等于 |
& | 按位与 |
^ | 异或 |
| | 按位或 |
&& | 逻辑与 |
|| | 逻辑或 |
?: | 三元运算符 |
= | 赋值 |
九、进制(0)
进制 | 结构 |
---|---|
二进制 | 0b或0B开头 |
十进制 | |
八进制 | 以0开头 |
十六进制 | 以0x或0X开头 |