1. 自增自减运算符: ++ 和 --
public static void main(String[] args) {
int x=10,y =2;
int result= y *++x;
System.out.println("result = "+result);
System.out.println("x = "+ x);
}
运行结果:
result = 22 ; x = 11
int result = y * x++;改成int result =y *++x;
运行结果: result = 20 ; x = 11
运行结果分析:
++x先执行x的自增操作,然后执行 y * x , 赋值给result;
x++ 先执行y*x , 赋值给result , 然后执行x的自增操作
关系运算符: > , < , >= , <=,== , != , 返回结果 true 或者false
2. 三目运算符:
public static void main(String[] args) {
System.out.println('a'==97?"true":"false");
}
运行结果: true
3. 逻辑运算符: &&和|| , & 和 |
public static void main(String[] args) {
int a=10;
if (a > 100 && (a / 0) > 0) {
System.out.println("执行了if");
}else{
System.out.println("执行了else");
}
}
运行结果:
执行了else
if (a > 100 && (a / 0) > 0)修改为if(a >100& (a/ 0) >0)
运行结果: Exception in thread "main"java.lang.ArithmeticException: / by zero
运行结果分析:
&&只要有一个返回false, 整个表达式返回false , 不需要执行后面的表达式 , &运算符会继续执行下面的表达式。
4. 位运算:&(与) , |(或) , ~(非) , ^(异或) ,>>(右移) , <<(左移) , >>>(无符号右移) ,<<<(无符号左移 ,java中不存在)
1. 与运算(num1 & num2):两个二进制位都为1 ,则返回1 ,否则返回0
2. 或运算(num1 | num2):两个二进制位都为0 , 则返回0 ,否则返回1
3. 异或运算(num1 ^ num2):两个二进制位不同 ,则返回1 ,否则返回0
4. 非运算(~num): num对应的二进制位为1 , 则返回0 , 如果为0 , 则返回1
5.左移(num << value):二进制数字num向左移动value对应的位数 ,高位也就是符号位移出(舍弃) , 0补最低位。数字没有溢出的前提下,左移一位都相当于乘以2,左移n位就相当于乘以2n。
6. 右移(num >> value):二进制数字num向右移动value对应的位数 ,符号位不变 , 如果num是负数,每一次右移都在左边补1,如果num为正数,每一次右移都在左边补0,这叫做符号位扩展(保留符号位)。右移一位相当于除2,右移n位相当于除以2n。
7. 无符号右移(num >>> value):二进制数字num向右移动value对应的位数 ,符号位也就是最高位用0补位。
8. 无符号左移(num<<<value):java中没有无符号左移的运算符 , 因为左移运算符就是无符号左移。
9. 注意有以下几种比较特殊的情况:
- 如果移动的位数value超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了33 % 32 = 1位。
- 如果移动的位数value为负数 , 对于int类型java取的是位移的value最低五位的数值 , 也就是最大值位31 , 对于long型取得是位移的value最低6位的数值 ,也就是最大值是63 , 那么编译器会移动(该类型的最大位数 + value) 位。如对int型移动-2位,实际上移动了31 + (-2) + 1 = 30位
- 正数右移到最后 , 结果为0 , 负数右移到最后 , 结果为-1(按补码进行位移分析)
- 位移之后 , 会将byte , short等范围小的类型转换为int类型
public static void main(String[] args) {
int num1=9,num2 =5;
int result = num1 & num2;
System.out.println("result = "+result);
}
运行结果 :
result = 1
int result = num1 & num2;修改为int result = num1| num2;运行结果 : result = 13
int result = num1 & num2;修改为int result = num1 ^ num2;运行结果 : result = 12
结果分析:
9 表示为二进制是 00001001 (为了清楚可见 , 忽略前面24个0)
5 表示为二进制是 0000 0101 (为了清楚可见 ,忽略前面24个0)
public static void main(String[] args) {
int x = 16;
int result = x << -31;
System.out.println("result= "+ result);
}
运行结果: result = 32
结果分析: 左移 -31位相当于左移1位 , 就是乘以2
public static void main(String[] args) {
int x = -16;
int result = x >>>2;
System.out.println("result= "+ result);
}
运行结果: result = 1073741820
结果分析:
- x转换为二进制位 10000000 00000000 00000000 00010000 ,
- 在计算机中保存的是补码 11111111 11111111 11111111 1111 0000 ,
- 无符号右移2位之后的值为 00111111 111111111111 1111 1111 1100
- 将其转为10进制 就是107374182