一、算术运算符
(一)基本四则运算符:+ - * / (除法) % (取余)
- " / " 相关注意事项
public class TestDemo {
public static void main (String[] args) {
System.out.println(5/2);//int/int结果还是int,所以要用double型
System.out.println(5.0/2);//double运算
System.out.println((float)5/2);//先将5转为float,在进行除法运算
System.out.println((float)(5/2);//将int结果强转为float
}
}
注意:1. %不仅可以对int求模(取余),也能对double进行求模(取余)
2. 0不能做除数
System.out.println(10 / 0);//执行结果:出现异常如下图
- “%” 相关注意事项(注意负数的除法运算)
System.out.println(10 % 3);//执行结果:1
System.out.println(-10 % 3);//执行结果:-1
System.out.println(10 % -3);//执行结果:1
System.out.println(-10 % -3);//执行结果:-1
(二)增量赋值运算符(复合运算符): += -= *= /= %=
eg:a += 10; 代表 a = a + 10;
short a = 1;
a = a + 1;//error,计算机默认左边为int,右边为short
a += 1;//2,复合运算符会帮我们强制类型转换
(三)自增/自减运算符: ++ - -
int a = 10;
int b = ++a;//执行结果:11
System.out.println(b);
//先a=a+1 再c=a
int a = 10;
int c = a++;//执行结果:10
System.out.println(c);
//先c=a 再a=a+1
int a = 10;
int b = ++a;//执行结果:11
System.out.println(b);
int c = a++;//执行结果:11
System.out.println(c);
//该处a赋值给c时,由于上面的++a,导致a的值为11时赋值给c;而打印出c之后a才自增变为12t
int i = 10;
i = i++;//执行结果:10
System.out.println(i);
//至于为什么等于10,学习java的反汇编指令,了解即可,较复杂
注意事项:1.若不取自增/自减运算的表达式的返回值,则前置自增/自减与后置自增/自减没区别
2.若取表达式的返回值,则前置返回值是自增/自减后的值,后置返回值是自增前的值
二、关系运算符
(一)主要有六种: == != < > <= >=
注意:关系运算符的表达式返回值都是boolean类型
三、逻辑运算符
(一)逻辑与&&(两个表达式都为true,结果为true,否则结果为false)
(二)逻辑或||(两个表达式都为false,结果为false,否则结果为true)
(三)逻辑非!(表达式为true,结果为false,表达式为false,结果为true,单目操作数,只有一个表达式,只能作用到boolean类型的数据)
(四)短路求值
- &&一旦表达式1为假,那么表达式2就不会被执行
- ||一旦表达式1为真,那么表达式2就不会被执行
System.out.println(10>20 && 10/0 == 0);//执行结果:false
System.out.println(10<20 || 10/0 == 0);//执行结果:true
//10/0之所以不报错是因为这两个代码都没有执行第二个表达式(短路求值)
注意:逻辑运算符操作数(往往是关系运算符的结果)和返回值都是boolean类型
四、位运算符
(一)java中对数据存储的最小单位是字节
(二)java中对数据操作的最小单位是二进制位
(三)位运算符主要有四个:&(按位与) |(按位或) ~(按位取反) ^(按位异或)
(四)以13(0000 1101)和11(0000 1011)为例参与二进制运算
- 按位与 & 计算结果:0000 1001(数字一样对应写,不一样写0)
- 按位或 | 计算结果 :0000 1111(数字一样对应写,不一样写1)
- 按位异或 ^ 计算结果:0000 0110(数字一样写0,不一样写1)
- 按位取反 ~ 以数字11为例:11110100(把0写为1,把1写为0)
五、移位运算符
(一)左移 << (左移往右边补0,左移相当于乘法)
eg:11<<1(11(0000 1011)左移1位),结果为:0001 0110(22 = 11*2)
11<<2,结果为:0010 1100(44 = 11*4)
(二)右移 >> (右移往左补符号位数字,右移相当于除法)
eg:11>>1,正数补符号位为0,结果为:0000 0101(5 = 11/2^1)
11>>2,结果为:0000 0010(2 = 11/2^2)
-1(1111 1111)>>1,负数补符号位为1,结果为1111 1111
(三)无符号右移 >>> (只补0即可)
六、条件运算符(三目运算符)
只有一种:表达式1?表达式2:表达式3
(表达式1为true,整个表达式的值为表达式2的值;表达式1为false,整个表达式的值为表达式3的值)
//求两个整数的最大值
int a = 10;
int b = 20;
int max = a>b?a:b;//执行结果:20
System.out.println(max);
七、运算符优先级
不必记忆,存在歧义的代码加上括号即可
八、进制问题
二进制(由0和1组成) 八进制(由0~7组成) 十进制(由0~9组成)
十六进制(由0~15组成:10以内用数字表示 10以上用a~f表示(大小写均可))
(一)十进制转二进制(一般不要求)
方法一:
eg1:求10的二进制:从靠近10的2的次方开始加,第一个为8,第二个为2,因此10=8+2
对应到下面的二进制格子中即可得到:0000 1010,
8和2分别在第2位和第四位,因此除去第二位和第四位,其他位置补0即可。
eg2:求75的二进制:第一个靠近75的为64,
第二个为靠近75-64=11的2的次方,为8;
以此类推,第三个为2,第四个为1
因此75的二进制对应到下面的格子可以得到:0100 1011
方法二:辗转相除法
eg:求10的二进制(如下图所示)
(二)二进制转十进制
eg1:求0000 1010的十进制:0000 1010 = 1*2^1+1*2^3 = 10
即:各个位数字*进制数^该位权重,每一位乘完之后相加即可
eg2:求 0100 1011的十进制:0100 1011 = 1*2^0+1*2^1+1*2^3+1*2^6 = 75
(三)二进制转八进制
eg:求130的八进制,则:
根据辗转相除法可知130的二进制为:010 000 010 =1000 0010(转八进制时常把二进制3位看作一体)
把010看为一个二进制,代表2;000代表0;010代表2;
即:202→正确写法:0202(八进制用0开头)
(四)二进制转十六进制
eg:求130的十六进制,则:
二进制:1000 0010(转十六进制时常把二进制四位看作一体)
把1000看作一个二进制,代表8;0010代表2;
即:0x0000 0082→0x82(十六进制用0x开头)
(五)十六进制转八进制(先转为二进制,再转为八进制)
(五)求负数的二进制
eg:先取其原码,得到反码,最后得到补码=反码+1,补码即为结果