一、运算符的分类
- 算数运算符:+,-,*,/,%,++,–
- 赋值运算符:=,+=,*=,/=,-=
- 关系运算符:==,!=,<=,>=,<,>,instanceof
- 逻辑运算符:&(并且,与),|(或者),!(非),^(异或),&&(短路与),||(短路或)
- 位运算符:&(与),|(或),^(异或) , ~(按位取反) , <<(左移) ,>>(右移) ,>>>(无符号右移)
- 三目运算符:(关系表达式) ? 表达式1 : 表达式2;
二、逻辑运算符
-
&:并且,在运算的过程中如果&的左边是false,右边要执行,且两边只要有一个false则结果为false。
-
&&:短路与,运算时&&左边为false,右边不执行。
两侧表达式运算结果:有false,则结果为false
-
||:短路或,运算时||左边为true则右边不执行。
两侧表达式运算结果:有true,则结果为true
-
|:或者,运算时不论|左右结果为哪一个,都要执行。
两侧表达式运算结果:有true,则结果为true
-
!:非,!false 结果为true,!true结果为 false
-
^:异或,运算时两侧结果相同,运算结果为false,不同为true
案例:
int a=2;
int b=3;
if(a++==3&++b==4){
a=23;
}
System.out.println("a="+a);
System.out.println("b="+b);
结果是a=3;b=4
int m=3;
int n=6;
if(m++==3|--n==4){
m=12;
}
System.out.println("m="+m);
System.out.println("n="+n);
结果是m=12;n=5
三、位运算符
- &(与),有0则0
- |(或),有1则1
- ^(异或) ,相同为0,不同为1
- ~(按位取反) ,有1为0,有0为1
<<(左移)
,先求该数的补码,再向左移动右边的位数,空位补0,最高位丢弃,最后将移动后的二进制数转为十进制数>>(右移)
,先求该数的补码,再向右移动右边的位数,最高位为0,空位补0,最高位是1,空位补1,最后将移动后的二进制数转为十进制数>>>(无符号右移)
,先求该数的补码,再向右移动右边的位数,空位补0,最高位丢弃,最后将移动后的二进制数转为十进制数
案例:
原码(-100):1110 0100
反码:1001 1011(符号位不变,其他位取反)
补码:1001 1100(反码+1,1为二进制的)
原码(9):0000 1001--------------->正数的原、反、补码是一样的
反码:0000 1001
补码:0000 1001
左移:将-100左移三位是:-32
|1 0 0 1 1 1 0 0|
1|0 0 1 1 1 0 0 0|------->左移一位
1 0|0 1 1 1 0 0 0 0|------->左移一位
1 0 0|1 1 1 0 0 0 0 0|------->左移一位
|左移三位后的数的补码
补码:1 1 1 0 0 0 0 0(被左移的数为负数)
反码:1 1 0 1 1 1 1 1---------------->补码求原码,给补码-1
原码:1 0 1 0 0 0 0 0------->左移三位的数为-32
右移:将-100右移三位是:
|1 0 0 1 1 1 0 0|
1|1 0 0 1 1 1 0|0------------->右移一位
1 1|1 0 0 1 1 1|0 0------------->右移一位
1 1 1|1 0 0 1 1|1 0 0------------>右移一位
右移三位的数 |----->再求它的反码---原码就是要求的数
| 原数的补码 |
无符号右移:将-100右移三位是:
|1 0 0 1 1 1 0 0|
0|1 0 0 1 1 1 0|0------------->右移一位
0 0|1 0 0 1 1 1|0 0------------->右移一位
0 0 0|1 0 0 1 1|1 0 0------------>右移一位
右移三位的数 |----->再求它的反码---原码就是要求的数
| 原数的补码 |
左移,右移的求法(针对于正数):
左移<<:给原数乘以2的移动次数幂 100<<3 是 100*2^3=800
右移>>:给原数除以2的移动次数幂 100>>3 是 100/2^3=12