Java_基础语法03_运算符

1.    显示当前时间

  a).    调用System.currentTimeMillis()方法获取存放在变量totalMilliseconds中从1970年1月1日午夜到现在的毫秒数(例如:1203183086328毫秒)。

  b).    通过将总毫秒数totalMilliseconds除以1000得到总秒数totalSeconds(例如:1203183086328毫秒/1000 = 1203183086秒)。

  c).    通过totalSeconds%60得到当前的秒数(例如:1203183086秒%60 = 26,这个值就是当前秒数)。

  d).    通过将totalSeconds除以60得到总的分钟数totalMinutes(例如:1203183086秒/60 = 20053051分钟)。

  e).    通过totalMinutes%60得到当前分钟数(例如:20053051分钟%60 = 31,这个值就是当前分钟数)。

  f).    通过将总分钟数totalMinutes除以60获得总的小时数totalHours(例如:20053051分钟/60 = 334217小时)。

  g).    通过totalHours%24得到当前的小时数(例如:334217小时%24 = 17,该值就是当前小时数)。

2.    算术运算符:+,-,*,/,%,++,--

  a).    +的用法:    a:加法    b:正号    c:字符串连接符

    System.out.println("hello"+'a'+1);    helloa1

    System.out.println('a'+1+"hello");    98hello

  b).    /和%的区别:        数据做除法操作的时候,/取得是商,%取得是余数

        int x = 3, y = 4;

        System.out.println(x + y);            // 7
        System.out.println(x - y);            // -1
        System.out.println(x * y);            // 12
        System.out.println(x / y);            // 0
        System.out.println(x * 1.0 / y);    // 0.75
        System.out.println(x % y);            // 3

  c).    算术运算结果的类型

    1.    当参与运算的元素类型相同时,结果的类型一定与运算元素的类型一致。

    2.    当参与运算的元素类型不同时,结果的类型一定与运算中类型大的元素类型一致。

        short s = 1;    //值在类型的取值范围内时,JVM会自动将值转换为需要的类型

        s = s + 1;        //错误,结果的类型为int类型,不能直接赋给short.

        s += 1;            //正确,+=会自动转换结果的类型

  d).    ++/--可以出现在变量的前面/后面。

  e).    无论出现在前面/后面,代码执行后变量一定加1/减1

  f).    ++/--出现在前面:先参与计算,再取值。

  g).    ++/--出现在后面:先取值,再参与计算。

    int y = (x++)+(++x)+(x*10);        //4+6+60

 //交换两个变量的值(不通过第三个变量实现)
 x = x + y;
 y = x - y;
 x = x - y;

3.    比较运算符:>,>=,<,<=,==,!=。

  a).    比较运算的结果一定为boolean类型

  b).    JAVA中不是所有的类型都可以使用比较运算符进行比较。如:boolean与其它类型。基本数据类型不能与引用数据类型进行比较。

4.    逻辑运算符:&,|,!,&&,||,^

  a).    逻辑与(&),逻辑或(|)

  b).    短路与(&&,当第一个表达式为false时,不执行第二个表达式,直接返回false),短路或(||,当第一个表达式为true时,不执行第二个表达式,直接返回true

  c).    逻辑非:!,取反

  d).    异或^:相同则false,不同则true。

5.    扩展运算符:+=,-=,*=,/=,%=,扩展运算符会自动转换结果的类型

  short s = 1;
  s += 1;    //正确,+=会自动转换结果的类型
  //不是等价于 s = s + 1; 而是等价于 s = (s的数据类型)(s + 1);

6.    位运算符:&,|,^,~,<<,>>,>>>

  A: 异或(^)的特殊用法:一个数据针对另一个数据位异或两次,该数不变

    注意:要做位运算,首先要把数据转换为二进制

        // &,|,^,~
        int a = 3;
        int b = 4;
        System.out.println(3 & 4);
        System.out.println(3 | 4);
        System.out.println(3 ^ 4);
        System.out.println(~3);
        /*
        分析:因为是位运算,所以我们必须先把数据换算成二进制。
        3的二进制:11
            00000000 00000000 00000000 00000011
        4的二进制:100
            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 (补码)
            补码:11111111 11111111 11111111 11111100
            反码:11111111 11111111 11111111 11111011
            原码:10000000 00000000 00000000 00000100
            结果是:-4
        */

    **一个数据针对另一个数据位异或两次,该数不变**

    int a = 10;
    int b = 20;

    System.out.println(a ^ b ^ b); //10
    System.out.println(a ^ b ^ a); //20

  B:    左移(<<)      左边最高位丢弃,右边补齐0

       右移(>>)      右边数值位丢弃,最高位是0,左边补齐0;最高为是1,左边补齐1

       无符号右移(>>>)    右边数值位丢弃,无论最高位是0还是1,左边补齐0

  面试题:

    a:请实现两个变量的交换

      int a = 10;

      int b = 20;

      **方式1:采用第三方变量

        int c = a;
        a = b;
        b = c;
        System.out.println("a:"+a+",b:"+b);

      **方式2:用位异或运算符(面试用)

        //左边a,b,a
        //右边a^b
        a = a ^ b;
        b = a ^ b; //a ^ b ^ b = a
        a = a ^ b; //a ^ b ^ a = b
        System.out.println("a:"+a+",b:"+b);

      **方式3:用变量相加的做法

        a = a + b; //a=30
        b = a - b; //b=10
        a = a - b; //a=20
        System.out.println("a:"+a+",b:"+b);

      **方式4:一句话搞定

        b = (a+b) - (a=b); //b=30-20=10,a=20
        System.out.println("a:"+a+",b:"+b);

    b:请用最有效率的方式计算出2乘以8的结果

      2<<3

        // <<,把<<左边的数据乘以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); // 6

        System.out.println(-24 >> 2); // -6
        System.out.println(-24 >>> 2); // 1073741818
        System.out.println(0b00111111111111111111111111111010); // 1073741818
        
        /*
        计算出3的二进制:11
            00000000 00000000 00000000 00000011
        (00)000000 00000000 00000000 0000001100
        
        ----------------------------------------------
        计算出-24的二进制
            原码:10000000 00000000 00000000 00011000
        
        >> 2的移动:
            原码:10000000 00000000 00000000 00011000
            反码:11111111 11111111 11111111 11100111
            补码:11111111 11111111 11111111 11101000
            
            11111111 11111111 11111111 11101000
            1111111111 11111111 11111111 111010(00) 补码
        补码:1111111111 11111111 11111111 111010
        反码:1111111111 11111111 11111111 111001
        原码:1000000000 00000000 00000000 000110
        结果:-6
            
        >>> 2的移动:
            原码:10000000 00000000 00000000 00011000
            反码:11111111 11111111 11111111 11100111
            补码:11111111 11111111 11111111 11101000
            
            11111111 11111111 11111111 11101000
            0011111111 11111111 11111111 111010(00)
        结果:1073741818
        ----------------------------------------------
    */

7.    三元运算符(三目运算符):x ? y : z ;x是一个boolean类型。当x为true时,返回y的值。当x为false时,返回z的值。

    int z = ((x = y)? x : y);     // 报错,这是赋值符号。

  获取三个整数中的最大值

    int a = 10,b = 30,c = 20;

    int max2 = (a > b)?((a > c)? a: c):((b > c)? b: c);

    int max2 = a > b?a > c? a: c:b > c? b: c;        // 这种做法不推荐。

    int i,j,k;    i=j=k=1;        // 该语句正确

猜你喜欢

转载自www.cnblogs.com/zhaolanqi/p/9229302.html