算数运算符
- 加号、减号、乘号(+、-、*)
- 相当于数学中的 +、-、*
- 除号(/)
- 整型相除,只保留整数,其余舍弃
- 整型、浮点型相除,保留小数
- 取余(%)
- 整型取余,结果为整数表现
- 整型、浮点型取余,结果为浮点数表现
- 自增、自减(++、--)
- 若 位于左侧,先进行变量本身的运算
- 若 位于右侧,先参与表达式的运算中
逻辑运算符
- 逻辑与、或、非(&、|、!)
- 与:表达式结果 都为 true,则结果为 true
- 或:表达式结果 都为 false,则结果为 false
- 非:对表达式的 结果取反
- 短路与、或(&&、||)
- 当 左侧表达式可以得出结果,则右侧直接跳过,不再参与运算
短路的内容不参与运算,不代表不参与编译,依旧会抛出异常
逻辑与、或、非,又可以称为 位与、位或、位非
位运算符
若 参与比较的不是布尔值,而是 实际的数值,则它与短路与、或、非存在差异
位与、或、非,是对应的二进制位进行比较,注意正、负数的按位非
按位与 &
:对应的二进制 同时为 1 则为 1,否则为 0
按位或 |
:对应的二进制 同时为 0 则为 0,否则为 1
按位非 ~
:对应的二进制 0 为 1,1 为 0
按位异或 ^
:对应的二进制 相同为 1,不同为 0
// 按位与 `&`:同时为 1 则为 1,否则为 0
System.out.println(12 & 3);
/*
12:00001100
3 :00000011
------------
:00000000
12 & 3 的结果:0
*/
System.out.println(13 & 4);
/*
13:00001101
4 :00000100
------------
:00000100
13 & 4 的结果:4
*/
// 按位或 `|`:同时为 0 则为 0,否则为 1
System.out.println(14 | 3);
/*
14:00001110
3 :00000011
------------
:00001111
14 | 3 的结果:15
*/
// 按位非 `~`:0 为 1,1 为 0
System.out.println(~3);
/*
3 :00000000 00000000 00000000 00000011
------------
运算结果:11111111 11111111 11111111 11111100
二进制的负数形式,可以先逆转为对应的正数,再得出实际的负数
正数结果:00000000 00000000 00000000 00000100 (+ 4)
实际结果: - 4
~3 的结果:-4
*/
// 按位异或 `^`:相同为 0,不同为 1
System.out.println(7 ^ 3);
/*
7 :00000000 00000000 00000000 00000111
3 :00000000 00000000 00000000 00000011
------------
:00000000 00000000 00000000 00000100
7^3 的结果:4
System.out.println(16 ^ 7);
// 原码 16:00000000 00000000 00000000 00010000
// 原码 7:00000000 00000000 00000000 00000111
// 按位异或:00000000 00000000 00000000 00010111
*/
位移运算符
- 左移
<<
- 二进制符号位向左移动,低位补 零
- 右移
>>
- 二进制符号位向右移动,正数高位补 零,负数高位补 一
- 无符号右移
>>>
- 二进制符号位向右移动,正、负数高位补 零
// 左移
System.out.println(10 << 2);
/*
10 的二进制:00001010
左移两位 :00101000
10 左移两位:40
*/
// 右移
System.out.println(10 >> 2);
/*
10 的二进制:00001010
右移两位 :00000010
10 右移两位:2
*/
// 无符号右移
System.out.println(-3 >>> 2);
/*
3 的二进制:00000000 00000000 00000000 00000011 (正 3 的原码)
-3 的二进制:11111111 11111111 11111111 11111101 (正 3 的补码)
-3 无符号右移两位:00111111 11111111 11111111 11111111 (正 3 的补码右移两位,高位补 零)
-3 >>> 2 的结果:00111111 11111111 11111111 11111111 (+ 1073741823)
得出,负数的无符号右移,相当于对应正数的补码右移,高位补零
*/
值得注意的是,整数字面值默认 int,是四字节三十二位的二进制
若负数的无符号右移出现数值极大的情况,注意当前数值类型的内存字节,对应的二进制位数
三目运算符
写法:表达式 ? 满足条件分支 1 : 不满足条件分支 2
可以嵌套使用,但为了可读性,不建议频繁使用
运算符存在执行的优先级,大多时候可以使用 ()
修改、控制