运算符

算数运算符

  • 加号、减号、乘号(+、-、*)
    • 相当于数学中的 +、-、*
  • 除号(/)
    • 整型相除,只保留整数,其余舍弃
    • 整型、浮点型相除,保留小数
  • 取余(%)
    • 整型取余,结果为整数表现
    • 整型、浮点型取余,结果为浮点数表现
  • 自增、自减(++、--)
    • 位于左侧,先进行变量本身的运算
    • 位于右侧,先参与表达式的运算中

逻辑运算符

  • 逻辑与、或、非(&、|、!)
    • 与:表达式结果 都为 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

可以嵌套使用,但为了可读性,不建议频繁使用

运算符存在执行的优先级,大多时候可以使用 () 修改、控制

上一篇:1. 常用的一些系统性能排查linux命令


下一篇:光天化日学C语言(17)- 位运算 ~ 的应用 | 0 变 1、1 变 0