首页 > 技术文章 > Java运算符

zbh355376 2021-02-22 20:17 原文

运算符分类:

  • 算数运算符

  • 关系运算符

  • 位运算符

  • 逻辑运算符

  • 赋值运算符

  • 其他运算符

算数运算符

操作符描述例子
+加法1+1=2
-减法3-2=1
*乘法2*3=6
/整除,当两边为整数时,取整3/2=1
3.0/2=1.5
%取余7%5=2
++自增,符号在前,先自增再输出,符号在后,先输出再自增a=3
System.out.println(a++); // 3
System.out.println(++a); // 5
--自减,符号在前,先自减再输出,符号在后,先输出再自减a=3
System.out.println(a--); // 3
System.out.println(--a); // 1

关系运算符

操作符描述例子
==检查如果两个操作数的值是否相等,如果相等则条件为真。1==1 true
!=检查如果两个操作数的值是否相等,如果值不相等则条件为真。1!=1 false
>检查左操作数的值是否大于右操作数的值,如果是那么条件为真。3>2 true
<检查左操作数的值是否小于右操作数的值,如果是那么条件为真。3<2 false
>=检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。3>=2 true
<=检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。3<=3 true

位运算符

在计算机中,有符号的数据的表示法通常分为 原码、反码和补码三种形式,所有的数据运算都是采用补码的是形式进行。

操作符描述
&如果相对应位都是1,则结果为1,否则为0
|如果相对应位都是 0,则结果为 0,否则为 1
^如果相对应位值相同,则结果为0,否则为1
~按位取反运算符翻转操作数的每一位,即0变成1,1变成0。
<<按位左移运算符。左操作数按位左移右操作数指定的位数。
>>按位右移运算符。左操作数按位右移右操作数指定的位数。
>>>按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。

实例:

public class Test {
    public static void main(String[] args) {
        System.out.println(1&2);// 1:0001 / 2:0010 / 0000 1&2=0
        
        System.out.println(1|2);// 0011 1|2=3
        
        System.out.println(20 << 6);
        // 补码:0001 0100 / 移位:00 0101 0000 0000 / 20<<6=1280
        
        System.out.println(-20 >> 6);
        // 原码:1001 0100 / 反码:1110 1011 / 补码:1110 1100 / 移位:1111 1111 / 反码:1111 1110 / 原码:1000 0001 / -20>>6=-1
        
        System.out.println(20 >> 3);
        // 补码:0001 0100 / 移位:0000 0010 / 20>>3=2
        
        System.out.println(-20 << 3);
        // 补码:1110 1100 / 移位:111 0110 0000 / 反码:111 0101 1111 / 原码:100 1010 0000 / -20<<3=-160
        
        System.out.println(-20 >>> 3);
        // 32位的补码:1111 1111 1111 1111 1111 1111 1110 1100 / 移位:0001 1111 1111 1111 1111 1111 1111 1101 / -20>>>3=536870909
    }
}

注意:

  • 右移位运算符>> 若操作值为正,则在高位插入0,若为负,则在高位插1。

  • 右移补零运算符>>>无论操作值正负,均在高位插入0。

  • 右移补零运算符>>>和右移位运算符>>若操作值为正,则结果相同。

  • 无符号右移的规则只记住一点:忽略了符号位扩展,0补最高位  无符号右移运算符>>> 只是对32位和64位的值有意义。

逻辑运算符

A为true,B为false

操作符描述例子
&&称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真。A && B false
||称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真。A || B true
!称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。!A false

赋值运算符

操作符描述例子
=简单的赋值运算符,将右操作数的值赋给左侧操作数C = A + B将把A + B得到的值赋给C
+=加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数C + = A等价于C = C + A
-=减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数C - = A等价于C = C - A
*=乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数C * = A等价于C = C * A
/=除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数C / = A,C 与 A 同类型时等价于 C = C / A
(%)=取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数C%= A等价于C = C%A
<<=左移位赋值运算符C << = 2等价于C = C << 2
>>=右移位赋值运算符C >> = 2等价于C = C >> 2
&=按位与赋值运算符C&= 2等价于C = C&2
^=按位异或赋值操作符C ^ = 2等价于C = C ^ 2
|=按位或赋值操作符C | = 2等价于C = C | 2

条件运算符( ? : )

条件运算符也被称为三元运算符,该运算符有3个操作数,并且需要判断布尔表达式的值,该运算符的主要是决定哪个值应该赋值给变量。

int a = 3>2 ? 1:0;

判断条件是否成立,若成立将返回第一个值,反之返回第二个值。

instanceof运算符

该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或者接口类型)。

String name = "zs";
boolean result = name instanceof String; // true

Java运算符优先级

下表中具有最高优先级的运算符在表的最上面,最低优先级在表的底部。

类别操作符关联性
后缀() 、 [] 、 . (点操作符)从左到右
一元expr++ 、 expr--从左到右
一元++expr 、 --expr 、 ~ 、 !从右到左
乘性* 、 / 、 %从左到右
加性+ 、 -从左到右
移位>> 、 >>> 、 <<从左到右
关系> 、 >= 、 < 、 <=从左到右
相等== 、 !=从左到右
按位与&从左到右
按位异或^从左到右
按位或|从左到右
逻辑与&&从左到右
逻辑或||从左到右
条件? :从右到左
赋值= 、 += 、 -= 、 *= 、 /= 、 %= 、 >>= 、 <<= 、 &= 、 |= 、 ^=从右到左
逗号,从左到右

Java运算符括号和自增优先级问题:遇到括号时,默认从左到右计算,遇到括号立即执行括号里的内容。

例题:

1. 
byte n = 5;
System.out.println(n++ + n++ * n++); // 5 + 6 * 7 / 47

2. 
byte n1 = 5, n2 = 6;
System.out.println(n1-- + n1 << 2 + n1++ * --n2 >>2); // 5 + 4 << 2 + 4 * 5 >> 2 / 9 << 22 >> 2 / 9 << 20 / 9 * 2的20次方 / 9437184

3. 
byte b1 = 8, b2 = 3;
int num = b1-- - b2++ * (++b1 * b1 << 2);// 8 - 3 * (8 * 8 << 2) / 8 - 3 * (64 << 2) / 8 - 3 * 256 / -760
System.out.println(num);

4. 
byte b1 = 7;
byte b2 = 9;
byte b3 = 10;
byte b4 = 12;
System.out.println(b1 | b2 ^ b3 & b4);
// 7 | 9 ^ 10 & 12
// 10 & 12 : 1010 & 1100 / 1000
// 1000 ^ 9 : 1000 ^ 1001 / 0001
// 0001 | 7 : 0001 | 0111 / 0111
//7

推荐阅读