运算符

算数运算符

image
+,-,,/都是比较简单的操作,简单演示即可
+的几种作用:
加法
正数
字符串连接符
除法的时候要注意一个问题:
整数相除,只能得到整数
要想得到小数,可以
1.0
/和%的区别

++和--的应用

单独使用效果相同
参与运算使用,在操作数的前后效果不同

i++和++i的差别

i++是先赋值再+
++i是先++再赋值

赋值运算符

符号:
= , +=, -=, *=, /=, %=
=为基本的赋值运算符,其他的为扩展的赋值运算符

关系运算符

image
注1:比较运算符的结果都是boolean型,也就是要么是true,要么是false。
注2:比较运算符“==”不能误写成“=” 。

逻辑运算符

image
逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成x>3 & x<6 。
“&”和“&&”的区别:
单&时,左边无论真假,右边都进行运算;
双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
“|”和“||”的区别同理,双或时,左边为真,右边不参与运算。
异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false

public class OptLuoJiDemo1 {
    public static void main(String[] args) {

        int a = 3;
        int b = 4;
        int c = 5;

        //&逻辑与运算
        System.out.println((a>b) & (a>c)); //false
        System.out.println((a>b) & (a<c)); //false
        System.out.println((a<b) & (a>c)); //false
        System.out.println((a<b) & (a<c)); //true


        //|逻辑或运算
        System.out.println((a>b) | (a>c)); //false
        System.out.println((a>b) | (a<c)); //true
        System.out.println((a<b) | (a>c)); //true
        System.out.println((a<b) | (a<c)); //true


        //^逻辑异或运算
        System.out.println((a>b) ^ (a>c)); // false
        System.out.println((a>b) ^ (a<c)); // true
        System.out.println((a<b) ^ (a>c)); // true
        System.out.println((a<b) ^ (a<c)); // false

        //!逻辑非运算
        System.out.println(!((a>b) ^ (a>c))); // true
        System.out.println(!((a>b) ^ (a<c))); // false

    }
}

public class OptLuojiDemo2 {
    public static void main(String[] args) {
        int a = 3;
        int b = 4;
        int c = 5;

        //&&双与
        System.out.println((a > b) && (a > c)); //false && false = false
        System.out.println((a > b) && (a < c)); //false && true = false
        System.out.println((a < b) && (a > c)); //true && false = false
        System.out.println((a < b) && (a < c)); //true && true = true

        //&逻辑与运算
        System.out.println((a>b) & (a>c)); //false
        System.out.println((a>b) & (a<c)); //false
        System.out.println((a<b) & (a>c)); //false
        System.out.println((a<b) & (a<c)); //true

        int x = 3;
        int y = 4;
//        boolean b1 = ((x++ == 3) & (y-- == 4));//x:3 y:4
//        System.out.println("x:"+x);
//        System.out.println("y:"+y);
//        System.out.println("b1:"+b1); //true

//        boolean b2 = ((x++ == 3) && (y++ == 4));
//        System.out.println("x:"+x);
//        System.out.println("y:"+y);
//        System.out.println("b2:"+b2);//true

//        boolean b2 = ((x++ == 6) && (y++ == 4));//左边为假,右边未参与运算
//        System.out.println("x:"+x);
//        System.out.println("y:"+y);
//        System.out.println("b2:"+b2);

//        boolean b1 = ((x++ == 6) & (y++ == 4));//无论真假,都进行运算
//        System.out.println("x:" + x);
//        System.out.println("y:" + y);
//        System.out.println("b1:" + b1); //false

//        boolean b1 = ((x++ == 6) | (y++ == 4));
//        System.out.println("x:" + x);
//        System.out.println("y:" + y);
//        System.out.println("b1:" + b1); //true

//        boolean b1 = ((x++ == 3) || (y++ == 4));
//        System.out.println("x:" + x);
//        System.out.println("y:" + y);
//        System.out.println("b1:" + b1); //true

位运算符

image

位运算是直接对二进制进行运算。

/*
    位运算:
        >>,>>>,<<,&,|,^,~

    想要进行位运算,就得先知道二进制
 */
public class OptWeiYunSuanDemo1 {
    public static void main(String[] args) {

        int x = 3;
        int y = 4;

        System.out.println(x & y);
        System.out.println(x | y);
        System.out.println(x ^ y);
        System.out.println(~x);

    }
}


/*
    分析:
        想要进行位运算,就得先知道二进制
    3的二进制:11
    4的二进制:100

    3的原码,反码,补码:00000000 00000000 00000000 00000011
    4的原码,反码,补码:00000000 00000000 00000000 00000100

    &位与运算:有0则0
        00000000 00000000 00000000 00000011
     &
        00000000 00000000 00000000 00000100
        ------------------------------------
        00000000 00000000 00000000 00000000

        结果是:0


    |位或运算:有1则1
        00000000 00000000 00000000 00000011
     |
        00000000 00000000 00000000 00000100
        -----------------------------------
        00000000 00000000 00000000 00000111

        结果是:7

    ^位异或运算:相同则0,不同则1
        00000000 00000000 00000000 00000011
     ^
        00000000 00000000 00000000 00000100
        -----------------------------------
        00000000 00000000 00000000 00000111
        结果是:7

     ~位取反,0变成1,1变成0
        00000000 00000000 00000000 00000011
        -----------------------------------
     ~  11111111 11111111 11111111 11111100

         符号位             数值位
   原码:  1           1111111 11111111 11111111 11111100
   反码:  1           0000000 00000000 00000000 00000011
   补码:  1           0000000 00000000 00000000 00000100

   结果是-4

 */
/*
        <<,>>,>>>

        <<左移:左边最高位丢弃,右边补齐0
        >>右移:最高位是0,左边补0,最高位是1,左边补1
        >>>无符号右移:无论最高位是0还是1,左边都用0补齐

 */
public class OptWeiYunSuanDemo2 {
    public static void main(String[] args) {
        //<<左移,左边的数据乘以2移动的次幂
        System.out.println(3 << 2); // 3*2^2 = 3*4 = 12
        //>>右移,左边的数据除以2移动的次幂
        System.out.println(24 >> 2); // 24 / 2^2 = 24 / 4 = 6
        System.out.println(24 >>> 2);

        System.out.println(56 >> 4); //56 / 2^4 = 56/16 = 3
        System.out.println(5 << 3); // 5 * 2^3 = 5 * 8 = 40


        System.out.println(-24 >> 2);
        System.out.println(-24 >>> 2);

    }
}

/*
            分析:
                要想参与位运算,就必须先得知道二进制
            1、计算出3的二进制:11
                 00000000 00000000 00000000 00000011
             (00)000000 00000000 00000000 0000001100
             结果是:12


            2、计算出24的二进制:11000
            00000000 00000000 00000000 00011000
            0000000000 00000000 00000000 000110(00)
            结果是:6

            3、计算出24的二进制:11000
            00000000 00000000 00000000 00011000
            0000000000 00000000 00000000 000110(00)
            结果是:6

            4、计算出24的二进制:11000
               原码:10000000 00000000 00000000 00011000
               反码:11111111 11111111 11111111 11100111
               补码:11111111 11111111 11111111 11101000

                     1111111111 11111111 11111111 111010(00) 补码
               补码:1111111111 11111111 11111111 111010
               反码:1111111111 11111111 11111111 111001
               原码:1000000000 00000000 00000000 000110
               结果是:-6

            5、计算出24的二进制:11000
               原码:10000000 00000000 00000000 00011000
               反码:11111111 11111111 11111111 11100111
               补码:11111111 11111111 11111111 11101000

                     0011111111 11111111 11111111 111010(00) 补码

               结果是:
 */
/*

    两个数值AB异或,其中A异或两次B,其值依旧是
 */
public class OptWeiYunSuanDemo3 {
    public static void main(String[] args) {

        int a = 3;
        int b = 4;

        System.out.println(a^b^b);
        System.out.println(a^b^a);

    }
}

面试题

请用最有效率的方式写出计算2乘以8的结果(位运算)
8=2^3(左移3位)
00000000 00000000 00000000 00000010

(000)00000000 00000000 00000000 00010000 =16

实现两个整数变量的交换(四种方法)

public class FourWay {
    public static void main(String[] args) {
        //第一种引入第三个变量
        int a=5;
        int b=6;
        int temp;
        temp=a;
        a=b;
        b=temp;
        System.out.println("交换前a:5"+"b:6"+"交换后a:"+a+"b:"+b);

        //算数符的优先级
        int i=1;
        int j=2;
        j=(i+j)-(i=j);
        System.out.println("交换前i:1"+"j:2"+"交换后i:"+i+"j:"+j);

        //变量相加(顺序结构)
        int c = 4;
        int d = 5;
        c=c+d;
        d=c-d;
        c=c-d;
        System.out.println("交换前c:4"+"d:5"+"交换后c:"+c+"d:"+d);
        //位或运算
        int e = 6;
        int f = 7;
        e=e^f;
        f=e^f;
        e=e^f;
        System.out.println("交换前e:6"+"f:7"+"交换后e:"+e+"f:"+f);
    }
}

^的特点

三目运算符

格式
(关系表达式)?表达式1:表达式2;
如果条件为true,运算后的结果是表达式1;
如果条件为false,运算后的结果是表达式2;
示例:
获取两个数中大数。
int x=3,y=4,z;
z = (x>y)?x:y;//z变量存储的就是两个数的大数。