逻辑运算符
运算符 | 含义 | 用法 | 结合方向 |
&&、& | 逻辑与 | op1&&op2 | 从左到右 |
|| | 逻辑或 | op1 || op2 | 从左到右 |
! | 逻辑非 | !op | 从右到左 |
注意:逻辑运算符&&和&都表示逻辑与,他们之间的区别在哪里呢?使用逻辑运算符&会判断两个表达式,而逻辑运算符&&则是针对Boolean类型的类进行判断,当第一个表达式为false时则不会判断第二个表达式,直接输出结果从而节省计算机判断的次数。从左端表达式就能推断整个表达式的值称为短路,&&属于短路运算符,&属于非短路运算符。
位运算符
位逻辑运算符
运算符 | 含义 | 举例 |
& | 与 | a&b 1&0 =0,1&1 =1 |
| | 或 | a | b 1 | 0 =1,0 | 0 =0 |
~ | 取反 | ~a ~1 =0 |
^ | 异或 | a^b 1^1 =0,0^0 =0,0^1 =1 相同为0,不同为1 |
位移运算符
运算符 | 含义 | 举例 |
<< | 左移 | 左移位后高位溢出舍弃,低位补0 a << 1 1 << 1结果为2(将10进制的1变转化为2进制,然后左移1位) |
>> | 右移 | 正数右移高位补0,低位溢出舍弃 负数右移高位补1,低位溢出舍弃 b >> 2 |
>>> | 无符号右移 | x >>>1 不适合byte及short类型 |
注意:负数采用补码表示,负数的补码 =反码 +1
1)左移
左移:高位溢出,低位补0
左移不区分正负,左移之后高位溢出舍弃,如果符号位发生变化,则结果溢出。左移通常result*
![](https://img-blog.csdnimg.cn/img_convert/bb0b40ed4048bd70cdc7a71c50f3f144.png)
2)右移
正数右移:高位补0,低位溢出。右移结果通常result/
![](https://img-blog.csdnimg.cn/img_convert/f256588c9df1e4be52f110f07ea83250.png)
负数右移:高位补1,低位溢出
![](https://img-blog.csdnimg.cn/img_convert/f5b042439cb4011403c624bac55b5840.png)
3)无符号右移
无符号右移:高位补0,低位溢出
![](https://img-blog.csdnimg.cn/img_convert/294c5c705b464b69f5360ba57e19db52.png)
注意:无符号右移不适合byte及short类型,byte及short属于低精度类型,做无符号右移会产生溢出,因此不适合做无符号右移操作。
程序例子:
public class Demo {
public static void main(String[] args){
int a = 24;
int b = -16;
int c = -256;
System.out.println(a+"右移2位结果:" +(a>>2)); //结果正确
System.out.println(b+"左移3位结果:" +(b<<3)); //结果正确
System.out.println(c+"无符号右移2位结果:" +(c>>>2)); //结果溢出,不准确
byte d =(byte)(-32>>>1); //结果溢出,不准确
System.out.println("d无符号右移1位结果:" +d);
short e = (short) (-64>>>3); //结果溢出,不准确
System.out.println("e无符号右移3位结果:" +e);
}
}
运行结果:
24右移2位结果:6
-16左移3位结果:-128
-256无符号右移2位结果:1073741760
d无符号右移1位结果:-16
e无符号右移3位结果:-8
三元运算符
三元运算符使用格式:
条件式?值1:值2
解释:若条件式的值为true,则表达式取值1,否则取值2
三元运算符等价于if...else语句,例如:
public class Demo {
public static void main(String[] args){
boolean a = (24<50)?true:false; //三元运算符返回值不能丢
System.out.println("a的结果:" +a);
}
}
a的结果:true