运算符总结

运算符总结

1.算术运算符

img

 

正负号*(+,-)*

img

 

除法

img

 

%*取模*

求余数

img

 

取模的正负取决与被除数:

img

自增

 

++)前自增:先自增完毕,再运算整个表达式,语句分号前面的都是运算表达式;

img

 

后自增,先运算完整个表达式(分号前面的都是表达式),再进行自增;

img

 

备注:参与自增运算的操作数据每次会加1.

结论:

如果运算符在变量的前面,则该变量自增1或者自减1,然后返回的是变量的新值,如

果运算符在变量的后面,则变量也会自增或者自减1,但是返回的是变量原来的值。++在前就是先运算,再取值,++在后就是先取值,再运算。

 

自增自减运算符案例:

完成如下运算:
    一;

       int i = 10;

int newNum = 10 * i++;

System.out.println(newNum);//?

     二:

       int i = 10;

int newNum = 10 * ++i;//?

System.out.println(newNum); //?

一可以理解为

       int i = 10;

int newNum = 10 * i;

i = i + 1;

二可以理解为

       int i = 10;

       i = i + 1;

2.赋值运算符

= , +=, -=, *=, /=, %=

img

a+=b 可以想象成 a=a+b;

变量声明完了之后,可以使用赋值语句(assignment statement)给变量赋一个值,Java中使用等号(=)作为基本的赋值运算符(assignment operator),

格式如下:

variable = expression;

变量    =  表达式;

变量我们已经知道如何声明,表达式具体如何定义?

表达式的定义:

表达式涉及到值(常量),变量和通过运算符计算出的值,以及他们组合在一起计算出的新值。

x =y+1;

例如:

public static void main(String[] args) {

int x = 1; // 声明int变量x, 赋值1给变量x

int y = 0; // 声明int变量y, 赋值0给变量y

double area; // 声明double变量area

double radius = 1.0; // 声明double变量radius,并赋值1.0给变量radius

x = 5 * (3 / 2) + 3 * 2; // 将=右半部分表达式的计算结果赋值给变量x

x = y + 1; // 将变量y和1的求和的值赋值给变量x

area = radius * radius * 3.14159; // 将计算面积的值赋值给变量area

}

3.比较运算符

如何比较两个值?使用比较运算符 3和5谁大,在java中如何比较?

比较运算符比较的两边操作数,结果都是boolean的,只有true和false两种结果。

img

注意的细节:

1.使用比较运算符的时候,要求两种数据类型必须一致。

byte、short、char会自动提升至int。

img

4.逻辑运算符

什么是逻辑运算符?连接比较运算符的符号称之为逻辑运算符。那么为什么要连接比较运算符? 举例:当你去公司应聘,招聘要求,男性(判断为真),并且开发经验1年(判断为假)那么,我们还适合去面试吗,不能,因为只满足了一项,总体是不满足的(总体结果为假)。

逻辑运算符用于对boolean型结果的表达式进行运算,运算的结果都是boolean型。我们的比较运算符只能进行一次判断,对于对此判断无能为力,那么逻辑运算符就可以经将较运算符连接起来。

img

逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成x>3 & x<6 。

“&”和“&&”的区别:单与时,左边无论真假,右边都进行运算;双与时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。

“|”和“||”的区别同理,双或时,左边为真右边不参与运算。

“ ^ ”异或与“|”或的不同之处是:当左右都为true时,结果为false。

& 与 |或 ^异或 !非

1***&***

  true & true = true ;

 false & true= false;

 true & false = false;

 false & false= false;

总结 & 符号特点

& : 只要两边的boolean表达式结果,有一个false.那么结果就是false

只有两边都为true ,将结果为true.

2***|***

 true   |  true   =true;

true   |  false =true;

false  |  true  =true;

false  |  false =false;

总结 | : 两边只要有一个为真结果就为真,当两边同为假时结果才为假.

3***^* *异或*

  true  ^  true =false;

 true  ^  false =true;

 false  ^  true= true;

 false  ^  false=false;

 

^ : 两边相同结果是false

两边不同结果是true;

 

4***!***

!true = false

!false= true

5***&&* *短路*

研究发现,&运算只有两边全为真的时候,结果才为真,那么当左边为假的时候就没有必要在进行判断,&&就产生了。

int a =4;

a >3 && a< 6;

a >3 & a< 6 ;

在这种情况下世没有区别的

如果:

a =2

a >3 & a< 6 2大于 3为假,接着运算 2小于6为真,总的结果为假

a >3 && a< 6; 此时a不大于3结果为false右边不运算了.即短路.所以&&比&效率稍微高了一点.

public static void main(String[] args) {

int x = 0;

int y = 1;

if (x == 0 && y == 1) {
System.out.println(x + y);
}
}

5.位运算符

按位操作符用来操作整数基本数据类型中的单个比特(bit),就是二进制,按位操作符会对两个参数中对应的位(bit)执行布尔运算,最终生成一个结果。按位操作符来源于C语言面向底层的操作,Java设计的初衷是嵌入式电视机机顶盒,所以面向底层的操作也保留了下来。

任何信息在计算机中都是以二进制的形式保存的,”&”、“|”、“^”除了可以作为逻辑运算符也可以作为位运算符。位运算是直接对二进制进行运算。他们对两个操作数中的每一个二进制位都进行运算。例如int是由32个二进制数组成,因此使用位运算符可以对整数值的二进制数进行运算。

位(bit)运算符:

img

规则:

可以把1当做true 0当做false

只有参与运算的两位都为1,&运算的结果才为1,否则就为0。

只有参加运算的两位都是0,|运算的结果才是0,否则都是1。

只有参加运算的两位不同,^ 运算的结果才为1,否则就为0。

1、*&* *与运算*

& 参见运算的两位数都为1,&运算符结果才为1,否则就为0。

6&3

img

 

2、*|* *或运算*

| 参与运算的两位都为0,|运算的结果才为0,否则就为1。

img

 

3、*^* *异或运算*

^只有参加运算的两位不同,^运算的结果才为1,否则就为0。

img

 

4、 ~取反

就是取反,二进制只有1和0,取反就是如果为1,取反就是0,如果是0,取反就是1。

img

System.out.println(~6);//-7

结论:当参与取反的数值是正数时,把对应的值加上负号,再-1;

当参与取反的数值是负数时,把对应的值加上负号,再-1;

负数的表现形式就是对应的正数取反,再加1。负数的最高位肯定是1。

*5、*负数表示

负数对应的正数的二进制-1,然后取反。

-6

img

*6、*异或特点

一个数异或同一个数两次,结果还是那个数. 用处一个简单的加密思想.

6^3^3

img

 

除了这些位运算操作,还可以对数据按二进制位进行移位操作,Java的移位运算符有三种。

6.移位操作符

面试题典例:

2*8 = 16 怎么算最快?

通过移位运算符:

<< 左移

>> 右移

>>> 无符号右移

二进制数:逢二进一!

0000 0000 0

0000 0001 1

0000 0010 2

0000 0011 3

0000 0100 4

0000 1000 8

0001 0000 16

 

imgimg

 

技巧:可以理解为二进制1就是true,0就是false。

 

案例:

1*、左移 (算术移位)*

3<< 2 是如何在计算机里是实现的?

首先将3转换为2进制,

000000000000000000000000000000113 的二进制
00000000 00000000 00000000 000011 左移2位,砍掉高位
0000 0000 0000 0000 0000 0000 0000 1100 低位补0

结果是12,所以3<<2 =12;

结论:左移就相当于乘以2的位移个数次幂.

2*、右移*

6>>2

000000000000000000000000000001106的二进制
000000 00000000 00000000 00000001 右移10被砍掉
00000000 00000000 00000000 00000001 高位补0

结果是1,所以6>>2 =1;

 

结论一个数往左移越移越大,往右边移越来越小.

推论

3<<2=12; 3<<1=6 ; 3<<3=24;

34=12 ; 32=6; 3*8=24;

322=12; 321=6 3*23 =24;

结论往左移几位就是乘以2的几次幂。

右移规律

6>>2=1 ;6>>1=3 ;

6/4=1 ; 6/2=3 ;

右移两位就是除以 2的2次方,右移一位就是除以2的一次方。

总结 :>> 是除以2的移动位数次幂

<< 是乘以2的移动位数次幂

用处*:**最快的运算是位运算。*

3*、无符号右移 (逻辑移位)*

通过演示发现右移时高位就空了出来, >>右移时高位补什么要按照原有 数据的最高位来决定。

1111-1111 1111-1111 1111-1111 1111-1010 -6>>2

1111-1111 1111-1111 1111-1111 1111-0010

最高位补什么要看原有最高位是什么

那么使用>> 后原来是最高位1的那么空出来的最高位还是1的,是0的还是0。

如果使用>>> 无论最高位是0还是1空余最高位都拿0补,这就是无符号右移。

1111-1111 1111-1111 1111-1111 1111-1010 -6>>>2

001111-1111 1111-1111 1111-1111 1111-10

结果是;1073741822

7.三元运算符

格式

(条件表达式)?表达式1:表达式2;

如果条件为true,运算后的结果是表达式1;

如果条件为false,运算后的结果是表达式2;

示例:

1获取两个数中大数。

int x=3,y=4,z;

z = (x>y)?x:y;//z变量存储的就是两个数的大数。

        int x = 1;

int y = 2;

int z;

z = x > y ? x : y;

System.out.println(z); //2

2判断一个数是奇数还是偶数。

int x=5;


System.out.println((x%2==0?"偶数":"奇数"));

那最后看看运算符的优先级与结合性~

img

img

posted @ 2020-09-10 21:48  墨染念颖  阅读(333)  评论(0)    收藏  举报