|-- 算术运算符
|-- 比较(关系)运算符
|-- 逻辑运算符
|-- 自加和自减运算符
|-- 赋值运算符
|-- 三目运算符
|-- 位运算符
程序控制流程(三大流程) |-- 顺序 |-- 选择 |-- 循环
算术运算符:
+
-
*
/
%
算术运算符的注意问题
如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。但被模数是负数就另当别论。
对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部
分。
“+”除字符串相加功能外,还能把非字符串转换成字符串 。“+”运算符两侧的操作数中只要有一个
String类型,一个是基本数据类型时,编译成class文件后,两个操作数就被连接成了一个新的String值。
比较(关系)运算符:
>
<
>=
<=
!=
==
比较运算符的结果是boolean类型
逻辑运算符:
连接多个条件的关联关系的
与 && & // 表示的是并且关系,全部为真则为真,否则为假 或 || | // 表示或者的关系,只要一者为真则为真,全部为假才为假 非 ! // 否定,取反
&& ||
短路与
短路或
知道结果不做更多的判断
短路与/或的效率更高,在编程建议使用短路与和短路或
自加和自减运算符:
++a
a++
--a
a--
前加加和后加加的优先级别不同引起的!!!!! 前加加的优先级别非常高,仅次于括号 后加加的优先级别非常非常低,甚至比赋值符都低
int a = 10;
int b,c ;
b = a++;
b = 10;
a =11;//因为优先级低所以先赋值再自加
c = ++a;
a = 12;//先自加才赋值
b = 12;
赋值运算符:
= // 将等号右侧的值赋给左侧的变量
双目运算符
+= // a += 10 等价于 a = a + 10
-= //同理
*=
/=
%=
三目运算符:
表达式 ? 值1: 值2
int a = 10;
int b = 20;
int c = a > b ? 100 : 200;
如果表达式成立,把值1赋给C
如果表达式不成立,把值2赋给C
位运算符:
计算机底层本质是二进制(半导体)运算
计算机底层使用的二进制运算
进制:
人类最长的使用的10进制
10个个位数:
0 1 2 3 4 5 6 7 8 9 逢10进1
二进制:
个位数只有2个:
0 1
一个字节即8位
无符号的时候:
1111 1111 255 最大值
0000 0000 0 最小值 0~255 256个值
基于正数的二进制运算
byte a = 5
byte b = 10
0000 0101
0000 1010
a + b
0000 0101
0000 1010
---------------
0000 1111 15
正数的源码、反码、补码一致,也就是正数没有源码、反码、补码之说
源码:数值的二进制状态码
反码:符号位不变,其余各位取反,得到的就是反码
补码:反码+1,就是补码
计算机底层本质上来说,是以补码运行的!!!!
引入负数
符号位的概念
最高位来表示数值的正负:0表示正数;1则表示该数是个负数
byte c = -1
byte d = 2
1000 0001
0000 0010
1000 0011 -3
那么用源码去算就会出现问题
(正数的源码、反码、补码一致,也就是正数没有源码、反码、补码之说)
源码:数值的二进制状态码
反码:符号位不变,其余各位取反,得到的就是反码
补码:反码+1,就是补码
计算机底层本质上来说,是以补码运行的!!!!
0000 0010 2
-1
1000 0001 源码
1111 1110 反码
1111 1111 补码
0000 0010 2
1111 1111 -1的补码
1 0000 0001 -1
因为以字节方式存储所以舍弃最高位 结果为 1
0000 0001 1
1000 0011 -3
-3 + 1 = -2
0000 0001 1
1111 1101 -3的补码
1111 1110 -2的补码
1111 1110
-1
1111 1101 -2的反码
最后结果
1000 0010 -2
无符号时
有符号的时候
0111 1111 +127
1000 0000 -128(将-0变为-128)
-128~127 256个值
八进制: 0561
十六进制:0~9 ABCDEF 0xAF89AD
位运算
& // 与运算
| // 或运算符
^ // 异或运算
~ // 按位取反
// 下面三个叫做移位运算
<< 左移运算符:二进制的补码向左移动(左移比较简单不涉及符号位)
>> 有符号右移运算:高位补1
>>> 无符号右移运算:高位补0
int a = 2;
计算机底层以二进制按位存储数据
让a从2变成8的最快方式是左移两位
a << 2
a = 8
& | ^
int a = 10;
int b = 11;
a & b; // 都为真,则为真
a | b; // 一者为真,则为真
a ^ b; // 相反为真
0000 1010
0000 1011 & 与运算
---------------
0000 1010 10
0000 1010
0000 1011 | 或运算
-----------
0000 1011 11
0000 1010 异或运算
0000 1011 ^ 位不同,相反,才为真
---------
0000 0001 1