算数运算符
操作符 | 描述 | 示例 |
+ | 加法 - 相加运算符两侧的值 | |
- | 减法 - 左边值 减去 右边值 | |
* | 乘法 - 相乘操作符两侧的值 | |
/ | 除法 - 左边值 除以 右边值 | 10/3=3 |
% | 取模 - 左边数 除以 右边数 所得的余数 | 10%3=1 |
++ | 自增: 操作数的值增加1 | a++; ++a |
-- | 自减: 操作数的值减少1 | a--; --a |
a++ 与 ++a 的区别
a++:变量a先参与程序的执行,然后变量a自加1
++a:变量a自加1,再参与程序的执行
int a = 12;
int b = a++;
System.out.println(b);
System.out.println(a);
控制台打印结果:
12
13
逻辑运算符
操作符 | 描述 | 示例 |
&& | 逻辑与运算符。当且仅当两边表达式都为真,条件才为真。 | true && false = false |
|| | 逻辑或操作符。两边任何一个为真,条件为真。 | true || false = true |
! | 逻辑非运算符。 | !true = false |
短路运算
表达式1 && 表达式2 如果表达式1为false,根据&&的规则,已经可以判断出整个表达式的结果,就不会继续判断表达式2;
表达式1 || 表达式2 如果表达式1为true,根据||的规则,已经可以判断出整个表达式的结果,就不会继续判断表达式2
比较运算符
操作符 | 描述 | 示例 |
> | 大于 | |
< | 小于 | |
>= | 大于等于 | |
<= | 小于等于 | |
== | 等于,判断两个变量的值是否相等 | |
!= | 不等于 |
赋值运算符
操作符 | 描述 | 示例 |
+= | 加等于 | a += 1 等价于 a = a + 1 |
-= | 减等于 | |
*= | 乘等于 | |
/= | 除等于 | |
%= | 取模等于 | a %= 3 等价于 a = a % 3 |
= | 等于 | a = 1 |
位运算符
在讲位运算之前,需要先了解二进制计算:
1 十进制转二进制
2 二进制转十进制
计算规则:
- 二进制数从右向左计算
- 每一位的值乘以2的(二进制位数-1)次方
- 所有的结果相加,即为十进制数
示例:1010转为十进制
0*20=0
1*21=2
0*22=0
1*23=8
8+0+2+0=10
所以 1010转换为十进制为10
3 正负数怎么样二进制表示
二进制原码反码补码转换 | ||
正数 | 符号位=0 如:0000 0000 1001 = 9 高位全部补0(红色部分) | 原码=反码=补码 |
负数 | 符号位=1 如: 1111 1111 1001 = -9 高位全部补1 | 反码=符号位不变,原码取反 |
补码=反码+1 | ||
注意,不管是正数还是负数,在计算机中全部存储的是补码。 |
正数,如数字9对应的二进制原码是1001,左边的位称为符号位(也叫高位),正数的符号位全部补0;
如果是8位二进制,则9 = 0000 1001
如果是16位二进制,则 9 = 0000 0000 0000 1001
负数,如数字-9对应的二进制原码1111 1001,高位是符号位全部补1;
如果是8位二进制,则-9 = 1111 1001
如果是16位二进制,则-9 = 1111 1111 1111 1001
4 位运算符
操作符 | 描述 | 示例 |
& | 与,如果对应位都是1,则结果为1,否则为0 | 2&3 = 0010 & 0011 = 0010 |
| | 或,如果对应位都是0,则结果为0,否则为1 | 2|3 = 0010 | 0011 = 0011 |
^ | 异或,如果对应位的值相同,则结果为0,否则为1 | 2^3 = 0010 ^ 0011 = 0001 |
~ | 非,按位取反运算符,二进制补码按位取反(包括符号位),即0变成1,1变成0 | ~60 = -61 |
<< | 按位左移运算符,符号位不变,二进制补码按位左移,低位补0 | 6 << 2 = 24 |
>> | 按位右移运算符,符号位不变,二进制补码按位右移,低位舍弃 | 6 >> 2 = 1 |
>>> | 按位无符号右移,低位舍弃,高位补0 | 60 >>> 2 = 15 |
示例
~ 非运算:二进制补码按位取反
2
原码 0 10
反码 0 10
补码 0 10
取反
补码 1 01
反码 1 00
原码 1 11
所以 ~2=-3
-2
原码 1 10
反码 1 01
补码 1 10
取反
补码 0 01
反码 0 01
原码 0 01
所以 ~-2=1
<<左移运算符
按位左移运算符,符号位不变,二进制补码按位左移,低位补0
9<<2
原码 0 1001
反码 0 1001
补码 0 1001
左移2位
补码 0 0010 0100
反码 0 0010 0100
原码 0 0010 0100
所以 9<<2=36
-9<<2
原码 1 1001
反码 1 0110
补码 1 0111
左移2位
补码 1 01 1100
反码 1 01 1011
原码 1 10 0100
所以 -9<<2=-36
>>右移运算符
按位右移运算符,符号位不变,二进制补码按位右移,低位舍弃
- >2
原码 0 1001
反码 0 1001
补码 0 1001
右移2位
补码 0 0010
反码 0 0010
原码 0 0010
所以 9>>2=2
-9>>2
原码 1 1001
反码 1 0110
补码 1 0111
右移2位(负数高位全部是1所以实际上是 1111 0111右移2位)
补码 1 01
反码 1 00
原码 1 11
所以-9>>2=-3
>>>
按位无符号右移,低位舍弃,高位补0
-5>>>2
原码 1000 0101
反码 1111 1010
补码 1111 1011
0011 1110
无符号右移2位,高位补0
补码 0011 1110
反码 0011 1110
原码 0011 1110
-5>>>2=32+16+8+4+2=62
-9>>>2
原码 1000 1001
反码 1111 0110
补码 1111 0111
无符号右移2位,高位补0
补码 0011 1101 此时高位为0,表示正数
反码 0011 1101
原码 0011 1101
三元运算符 ?:
条件运算符也被称为三元运算符。该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符主要是决定哪个值应该赋值给变量。
(expression) ? value if true : value if false
示例:
int a = 1;
int b = 2;
String c = (a > b) ? "yes" : "no";
运算符优先级
运算符有优先级,如果不确定运算符的优先级,可以使用小括号将需要先计算的代码括起来
运算符优先级,从左到右越来越低:
() ++ -- !
~ instanceof * / % + -
<< >> >>>
< > <= >= == !=
& ^ && || ?: