java运算符

一:算术运算符(+,  -,   *,  /,  ++,  --, )

 1、+号 :可以做加法运算(加号两边为字符和数字)、正数表示

                  字符串连接符:只要+号两边其中有一边有字符串,输出时加号就充当连接符 

                                          例: System.out.println(“hello”+’a’+1);  输出 helloa1  (从左到右)

                                                  System.out.println(‘a’+1+”hello”);  输出 98hello (a的ASCII码值为97)

 2、/和%:/取整,想要得到小数可以*1.0。

                 %取余。

 3、++和--:在变量的前面表示先运算在赋值,在变量的后面表示先赋值在运算。

                   例:a = 4;b = (a++)+(++a)+(a*10) ;   结果a=6,b=70

二:赋值运算符(= ,  +=,  -=,  *=,  /=,  %=)

 1、  short s=1;      short s=1;

          s = s+1;             s+=1; 

      上面两个代码有没有问题,如果有,那里有问题?(为什么 s = s+1不等同于s+=1)

答:第一个有问题,因为变量参与运算,首先会提升数据类型,然后做运算。所以 s = s+1;s会提升到int类型然后再做加法运算,最终的结果是int类型,所以拿short类型接收会报错,所以要想成功赋值,就得强制类型转换。

       第二个代码没有问题,是因为内部自动包含了强制类型转换,s+=1 ===> s = (s的数据类型)(s+1)

三:关系运算符(== ,   !=,   >,   <,   >=,    <=)

 1、概述:关系运算符表示一个判断,判断的结果是boolean类型,true和false。所以在赋值时只能用boolean来定义

                例: boolean flag = (a == b);如果a等于b则flag为true,反之则为false

四:逻辑运算符

 1、概述:逻辑运算符的两边放的是boolean类型的值,计算的结果也是一个boolean类型的值。

 2、若执行((a++ == 3) 逻辑运算符(b++ == 4))

       &(与): 两边有false,则false,两边都做运算

       | (或):  两边有true,则true,两边都做运算

      ^(异或): 两边相同为false,不同为true,两边都做运算

      &&(短路与): 两边有false,则false,当&&左边的表达式结果为false的时候,结果肯定为false,右边不执行b++。

       || (短路或):  两边有true,则true,当||左边是true的时候,结果肯定是true,右边不执行。

 3、!(a == b)  !表示非的意思,a等于b则结果为false。

五、位运算符(<<,  >>,  >>>,  &,  |,  ^,  ~)

  1、&,|,^       求  3 位运算符 4  ?  

      由于数据在计算机中参与运算的都是补码,先求出两边的补码,在根据补码进行位运算,在吧补码转换成原码。

      3的二进制:00000011
      4的二进制:00000100
      又由于3和4都是正数
      3的补码:00000011
      4的补码:00000100

     

java运算符

  2、~(非):将1变成0,0变成1

        4的补码是00000011          

         ~4补码是11111100    其原码为10000100  ,所以结果为  —4。

(<<,>>,>>>)

 3、<<:

       3<<2,二进制左移2位,右边用0补齐
       3的二进制:00000000 00000000 00000000 00000011
       由于3是正数,所以原码,反码,补码都一样
       3的补码:00000000 00000000 00000000 00000011
       左移:
            00000000 00000000 00000000 00000011
        (00)00000000 00000000 00000000 00001100   (补码)
      由于最高位是0,既是补码也是原码,所以结果是:  12

      ================================================================
 4、>>:

     (24>>2),二进制右移两位,最左边最高位是0用0补齐,最高位是1就用1补齐,多出来的丢弃。
      24的二进制:00000000 00000000 00000000 00011000
      由于24是正数,所以原码,反码,补码都一样
      24的补码:00000000 00000000 00000000 00011000
      右移:
              00000000 00000000 00000000 00011000
              0000000000 00000000 00000000 000110(00)  (补码)
      由于最高位是0,既是补码也是原码,所以结果是:6

      ================================================================
      (-24>>2)
      -24的二进制:10000000 00000000 00000000 00011000
      已知原码求补码:
        原码:10000000 00000000 00000000 00011000
        反码:11111111 11111111 11111111 11100111
        补码:11111111 11111111 11111111 11101000
      右移:
            11111111 11111111 11111111 11101000
            1111111111 11111111 11111111 111010(00)  (补码)
      已知补码求原码:
        补码:11111111 11111111 11111111 11111010
        反码:11111111 11111111 11111111 11111001
        原码:10000000 00000000 00000000 00000110
        最终结果是:-6

        ==============================================================
 5、>>>:

    (-24<<<2)无符号右移,无论左边最高是0还是1,都用0补齐,多出来的丢弃。
       -24的二进制:10000000 00000000 00000000 00011000
      已知原码求补码:
        原码:10000000 00000000 00000000 00011000
        反码:11111111 11111111 11111111 11100111
        补码:11111111 11111111 11111111 11101000
        无符号右移2位:
             11111111 11111111 11111111 11101000
             0011111111 11111111 11111111 111010(00)   (补码)
        由于最高位是0,所以它的原码,反码,补码都是一样的。
        最终结果位:0011111111 11111111 11111111 111010 = 1073741818

 6、(3<<2)可以看成3*2^2 =12 

      (24>>2)可以看成24/(2^2)=6

      (-24>>2)可以看成-24/(2^2)=-6

        (2<<3)   可以看成2*(2^3)=16   

      >>>求正数时可以看成>> 的右移,负数时则需要按照上面的步骤去算了

上一篇:C学习第二站


下一篇:C语言学习之初识C语言