Fork me on GitHub

Java中的运算符

Java运算符分为几种?

算术运算符、关系运算符、位运算符、逻辑运算符、赋值运算符、其它运算符

算术运算符

点击查看代码
package com.leadmap.java.typecast;

/**
 * Company: XXXXXX
 *
 * @description: 算术运算、类型转换
 * @author: banmao
 * @date: 2022/1/13 14:18
 */
public class ArithmeticOperation {

    public static void main(String[] args) {

        // 算术运算符
        char ch = 'a'; // ASCII表中'a'表示的数字为97
        int ch2i = ch; // 自动类型转换
        long ss = ch; // 自动类型转换
        System.out.println(ch2i); // 输出为97

        int a1 = -9 % 3;
        int a2 = -8 % 3;
        System.out.println(a1); //输出为0
        System.out.println(a2); // 输出的是-2

        byte b1 = 11;
        byte b2 = 12;
        // 以下(b3-b7)编译出错,整型运算时,byte、short会自动类型提升为int
//        byte b3 = b1 + b2;
//        byte b4 = b1 - b2;
//        byte b5 = b1 * b2;
//        byte b6 = b1 / b2;
//        byte b7 = b1 % b2;
        // 操作符在左边表示先自增(自减),再运算
        // 操作符在右边表示先运算,再自增(自减)
        byte b8 = b1++;
        byte b9 = b2--;
        System.out.println("b1原值:" + b1 + ",b2原值:" + b2); // b1原值:12,b2原值:11
        int b10 = ++b1 + b2;
        System.out.println("(++b1 + b2)=" + b10); // (++b1 + b2)=24
        System.out.println("b1:" + b1 + ",b2:" + b2); // b1:13,b2:11
        int b11 = b1++ + b2;
        System.out.println("(b1++ + b2)=" + b11); // (b1++ + b2)=24
        System.out.println("b1:" + b1 + ",b2:" + b2); // b1:14,b2:11
        int b12 = b1 + --b2;
        System.out.println("(b1 + --b2)=" + b12); // (b1 + --b2)=24
        System.out.println("b1:" + b1 + ",b2:" + b2); // b1:14,b2:10
        int b13 = b1 + b2--;
        System.out.println("(b1 + b2--)=" + b13); // (b1 + b2--)=24
        System.out.println("b1:" + b1 + ",b2:" + b2); // b1:14,b2:9

        char ch1 = 'a';
        char ch2 = 'b';
        // 以下(ch3-ch4)编译出错,整型运算时,byte、short会自动类型提升为int
//        char ch3 = ch1 + ch2;
//        char ch4 = b1 + ch1;

        short sh1 = 22;
        short sh2 = 23;
        // 以下(sh3-sh4)编译出错,整型运算时,byte、short会自动类型提升为int
//        short sh3 = sh1 + sh2;
//        short sh4 = b1 + ch1;
//        short sh5 = b1 + sh1;
//        short sh6 = ch1 + sh1;

        int i = 356;
        byte b = (byte) i;
        System.out.println(b); // 输出100,舍去了高位1

        boolean bool1 = true;
        boolean bool2 = false;
        //int bool3 = (int) bool1; // 编译异常,boolean不能进行转换类型
        //int bool4 = bool1 + bool2; // 编译异常,布尔型不能进行算术运算
    }
}

关系运算符

点击查看代码
package com.leadmap.java.typecast;

/**
 * Company: XXXXXX
 *
 * @description: 关系运算
 * @author: banmao
 * @date: 2022/1/13 16:03
 */
public class RelationalOperation {

    public static void main(String[] args) {
        // 关系运算,> < == != >= <=
        // 基本数据类型使用关系运算符
        int i1 = 97;
        int i2 = 97;
        short s1 = 97;
        byte b1 = 97;
        char c1 = 'a';
        float f1 = 97f;
        double d1 = 97d;
        long l1 = 97L;
        System.out.println(i1 == i2);
        System.out.println(i1 == s1);
        System.out.println(i1 == b1);
        System.out.println(i1 == c1);
        System.out.println(i1 == f1);
        System.out.println(i1 == d1);
        System.out.println(i1 == l1);

        int i3 = 98;
        short s2 = 100;
        byte b2 = 122;
        char c2 = 'c';
        System.out.println(i3 > b2);
        System.out.println(i1 < s2);
        System.out.println(b1 > c2);
        System.out.println(c1 < c2);

        // 引用数据类型使用关系运算符
        String str1 = "111";
        String str2 = "111";
        System.out.println(str1 == str2);
        System.out.println(str1 != str2);
        //编译报错 >、<、>=、<=不可用于引用类型
        //System.out.println(str1 > str2);

        // 引用数据类型与基础类型使用关系运算符
        String str3 = "97";
        int i4 = 97;
        short s3 = 97;
        // 编译报错,不可用于引用类型与基础类型进行关系运算
//        System.out.println(str3 != c3);
//        System.out.println(str3 <= s3);
    }
}

位运算符

点击查看代码
package com.leadmap.java.typecast;

/**
 * Company: XXXXXX
 *
 * @description: 位运算符
 * @author: banmao
 * @date: 2022/1/13 17:19
 */
public class BitOperation {

    public static void main(String[] args) {
        // 位运算符 &、|、^、~、<<、>>、>>>

        // 按位与
        byte b1 = 0b00001010;
        byte b2 = 0b01001001;

        byte b3 = (byte) (b1 & b2);
        System.out.println("b3:" + b3);
        byte b4 = (byte) (b1 | b2);
        System.out.println("b4:" + b4);
        byte b5 = (byte) (b1 ^ b2);
        System.out.println("b5:" + b5);
        byte b6 = (byte) (~b1);
        System.out.println("b6:" + b6);
        byte b7 = (byte) (b1 << 2);
        System.out.println("b7:" + b7);
        byte b8 = (byte) (b1 >> 2);
        System.out.println("b8:" + b8);
        byte b9 = (byte)213;
        System.out.println("b9:" + b9);
        byte b10 = -128;
        byte b11 = (byte)(b10 >> 2);
        byte b12 = (byte)(b10 >>> 2);
        System.out.println("b11:" + b11);
        System.out.println("b12:" + b12);
        byte b13 = -0b00010001;
        System.out.println(b13);

        byte b16 = -17;
        byte b17 = (byte)(b16 >> 2);
        byte b18 = (byte)(b16 >>> 2);
        System.out.println("b17:" + b17);
        System.out.println("b18:" + b18);

        //byte b14 = 0b10000000;
        byte b15 = (byte)0b10000000;
        System.out.println(b15);
        // java首位为符号位吗?
        // byte是为有符号位的整数,short、int、long都是
        // 那为什么首位为符号位,不能将byte = 0b10000000呢?

        byte b19 = (byte)-0b11100000;
        byte b20 = (byte)-233;
        System.out.println("b19:" + b19);
        System.out.println("b20:" + b20);

    }
}

逻辑运算符

点击查看代码
package com.leadmap.java.typecast;

/**
 * @author banmao
 * @version V1.0.0
 * @date 2022/1/16 下午5:42
 * @description 逻辑运算符
 */
public class LogicalOperator {
    public static void main(String[] args) {
        // 三种逻辑运算符 &&、||、!

        int kk = 1;
        int aa = 2;
        // &&短路
        if ((aa < kk) && comparator()) {
            System.out.println("aa小于kk");
        }
        // ||短路
        if ((aa > kk) || comparator()) {
            System.out.println("aa大于kk");
        }

        if (!(aa >= kk)) {
            System.out.println("aa不大于等于kk");
        }

    }

    public static boolean comparator() {
        System.out.println("进来了");
        return false;
    }
}

赋值运算符

点击查看代码
package com.leadmap.java.typecast;

/**
 * @author banmao
 * @version V1.0.0
 * @date 2022/1/17 下午8:06
 * @description 赋值运算符
 */
public class AssignmentOperator {

    public static void main(String[] args) {
        // 赋值运算符=、+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=
        int a = 5;
        int b = 6;
        a += b;
        System.out.println("a+=b,a=" + a + ", b=" + b);
        a -= b;
        System.out.println("a-=b,a=" + a + ", b=" + b);
        a *= b;
        System.out.println("a*=b,a=" + a + ", b=" + b);
        a /= b;
        System.out.println("a/=b,a=" + a + ", b=" + b);
        a %= b;
        System.out.println("a%=b,a=" + a + ", b=" + b);
        a <<= b;
        System.out.println("a<<=b,a=" + a + ", b=" + b);
        a >>= b;
        System.out.println("a>>=b,a=" + a + ", b=" + b);
        a &= b;
        System.out.println("a&=b,a=" + a + ", b=" + b);
        a ^= b;
        System.out.println("a^=b,a=" + a + ", b=" + b);
        a |= b;
        System.out.println("a|=b,a=" + a + ", b=" + b);

        //赋值运算符支持byte、char、short、int、long,且部分支持float、double、boolean
        float a1 = 33;
        float a2 = 22;
        // 以下均编译异常,float、double不能进行位运算
//        a1<<=a2;
//        a1>>=a2;
//        a1&=a2;
//        a1^=a2;
//        a1|=a2;
        //将boolean的false看为0,true看为1,带入到位运算中
        boolean b2 = true;
        boolean b3 = true;
        b2&=b3;
        System.out.println("b2&=b3,b2=" + b2);
        b2|=b3;
        System.out.println("b2|=b3,b2=" + b2);
        b2^=b3;
        System.out.println("b2^=b3,b2=" + b2);
    }
}

其他运算符(三目运算符与instanceOf)

点击查看代码
package com.leadmap.java.typecast;

/**
 * @author banmao
 * @version V1.0.0
 * @date 2022/1/17 下午8:49
 * @description 三目运算符与instanceof
 */
public class TernaryOperator {

    public static void main(String[] args) {
        // 三目运算符
        int i = 1;
        // 一般用做简单的逻辑判断的简写,较复杂的逻辑不建议使用三目运算符
        String operator = operatorTernary(i);
        System.out.println(operator);

        // instanceOf运算符,用于判断对象类型
        String s1 = "111";
        if (s1 instanceof String) {
            System.out.println("s1属于String对象实例");
        } else {
            System.out.println("s1不属于String对象实例");
        }
    }

    private static String operatorTernary(int i) {
        return i == 1 ? "i等于1" : "i不等于1";
    }

}

运算符的优先级

运算符的优先级按以下图,从上到下,从左到右进行排序。运算符的优先级比较复杂,靠硬记也比较困难,其实记住小括号()、加减乘除、自增、自减、&&、||、关系运算符这些优先级就够了。

扩展

1、byte为有符号位整数,那为什么byte不能等于ob10000000(10000000是-128的补码,计算机中负数就是以补码存储的)呢?

byte b1 = 0b10000000; // 编译出错
byte b2 = (byte)0b10000000; // 强转
System.out.println(b2); // 输出-128

个人理解在于,在java编译中,所有的整数都是以它原值(无符号位)来判断范围的,比如10000000表示的是128,这时128不属于byte的范围(-128~127),于是编译出错,需要强转,当运行时,就将10000000作为符号位进行解析,于是打印出来b2为-128。个人总结:Java是运行时有符号整数。

2、右移运算中右操作数为负数时,结果会怎样?例如下面的例子

int x = -1;
System.out.println(x >>> -30);  // 结果为0011 1111 1111 1111 1111 1111 1111 1111

3、怎么快速计算左移?
比如byte b1 = 1;b1 << 1 = 2,b1 << 2 = 4,b1 << 3 = 8,b1 << 4 = 16,这个规律性就出来了,左移一位,数字就增加两倍。右移也是如此,那无符号右移呢?无符号右移在正数情况是缩小两倍,但是在负数情况下不同。
4、为什么右移与无符号右移计算结果相同呢?比如byte b16 = -17;byte b17 = (byte)(b16 >> 2);byte b18 = (byte)(b16 >>> 2);结果都是-5
因为Java中byte的运算表达式会先提升类型为int,然后再去计算,所以byte转为int时高位都为0,于是不影响右移与无符号右移的结果。但是请看下面这个例子:

int i14 = 0b11111111111111111111111111111110; // 十进制等于-2
int i15 = i14 >> 1;
int i16 = i14 >>> 1;
System.out.println(i15);  // 输出-1
System.out.println(i16); // 输出2147483647

当i14这个数进行右移时,无符号右移在左边补的是0,于是这个数符号位为0,所以为正的2147483647。
5、(1)当进行位运算时,负数参与运算时,都是用的补码进行运算。(2)byte b = -17,那么用二进制来声明的话,byte b = (byte) 0b11101111,用补码的形式来表示。(3)正数,负数的十进制值都是用原码来计算的,比如-17虽然在计算机中用补码来表示=(byte) 0b11101111,但是输出在控制台中,是以(byte) 0b10010001来输出的=(-17)

posted @   三脚半猫  阅读(75)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
点击右上角即可分享
微信分享提示