首页 > 代码库 > 运算符

运算符

运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
算术运算符:

运算符
运算
范例
结果

+

正号

+3

3

-

负号

b=4; -b

-4

+

5+5

10

-

6-4

2

*

3*4

12

/

5/5

1

%

取模

7%5

2

++

++

自增(前):先运算后取值

自增(后):先取值后运算

a=2;b=++a;

a=2;b=a++;

a=3;b=3

a=3;b=2

- -

- -

自减(前):先运算后取值

自减(后):先取值后运算

a=2;b=- -a

a=2;b=a- -

a=1;b=1

a=1;b=2

+

字符串相加

“He”+”llo”

"Hello"

注意:1) /:   int i = 12;  i = i / 5;整数之间做除法时,只保留整数部分而舍弃小数部分
           2) %:最后的符号只跟被模数相同
           3)前++:先+1,后运算     后++:先运算,后+1
           4)+:String字符串与其他数据类型只能做连接运算,且结果为String类型。

赋值运算符:

  =    +=   -=  *=    /=   %=
  int i= 12;
  i  = i * 5;
  i *= 5;//与上一行代码同样的意思

 注意:

    short s = 10;
    s = s + 5;//报编译的异常
    s = (short)(s + 5);
    s += 5;//s = s + 5,但是结果不会改变s的数据类型。

比较运算符(关系运算符):

 ==  >   <  >=   <=    instanceof 
 注意:区分==  与 =  区别
进行比较运算操作以后,返回一个boolean类型的值
4>=3  表达的是4 > 3或者 4 = 3.结果是true。

  if(i > 1 && i < 10){  }   
不能写为:if(1 < i < 10){}

逻辑运算符:

a
b
a&b
a|b
!a
a^b
a&&b
a||b

true

true

true

true

false

false

true

true

true

false

false

true

false

true

false

true

false

true

false

true

true

true

false

true

false

false

false

false

true

false

false

false

1、&与

true & true = true ;  
false & true= false;  
true & false = false;  
false & false= false;

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

2、&& 短路

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

  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右边不运算了.即短路.所以&&&效率稍微高了一点.

【注意】区分 &  与 && 的区别,以及 |  与 || 的区别

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

  我们使用的时候,选择&& , ||

3、| 或

true   |  true   =true;  
ture   |  false =true;  
false  |  true  =true;  
false  |  false =flase;

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

4、^ 异或

true  ^  true =false;  
ture  ^  false =true;  
false  ^  true= true;  
false  ^  false=flase;

  ^ : 两边相同结果是false

位运算符:位运算是直接对二进制进行运算

运算符

运算

范例

<<

左移

3 << 2 = 12 --> 3*2*2=12

>>

右移

3 >> 1 = 1  --> 3/2=1

>>>

无符号右移

3 >>> 1 = 1 --> 3/2=1

&

与运算

6 & 3 = 2

|

或运算

6 | 3 = 7

^

异或运算

6 ^ 3 = 5

~

反码

~6 = -7
 位运算符的细节
<<空位补0,被移除的高位丢弃,空缺位补0。
>>

被移位的二进制最高位是0,右移后,空缺位补0;

最高位是1,空缺位补1。

>>>被移位二进制最高位无论是0或者是1,空缺位都用0补。
&二进制位进行&运算,只有1&1时结果是1,否则是0;
|二进制位进行 | 运算,只有0 | 0时结果是0,否则是1;
^

相同二进制位进行 ^ 运算,结果是0;1^1=0 , 0^0=0

不相同二进制位 ^ 运算结果是1。1^0=1 , 0^1=1

~
正数取反,各二进制码按补码各位取反
负数取反,各二进制码按补码各位取反



1、左移 (算术移位)

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

 首先将3转换为2进制, 

00000000

00000000

00000000

00000011

3 的二进制

00000000

00000000

00000000

000011

左移2位,砍掉高位

0000 0000

0000 0000

0000 0000

0000 1100

低位补0

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

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

2、右移

 6>>2

00000000

00000000

00000000

00000110

6的二进制

000000

00000000

00000000

00000001

右移10被砍掉

00000000

00000000

00000000

00000001

高位补0

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

 

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

推论

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

 3*4=12 ;  3*2=6;    3*8=24;

 3*22=12;   3*21=6    3*23 =24;

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

右移规律

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

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

右移两位就是除以 22次方,右移一位就是除以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

4、& 与运算

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

6&3 

技术分享

5、| 或运算

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

技术分享

6、^ 异或运算

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

技术分享

异或特点

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

6^3^3 

技术分享

7、 ~取反

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

技术分享

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

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

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

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

负数表示

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

-6 

技术分享

三元运算符:

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

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

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

示例:

1.获取两个数中大数。

int x=3,y=4,z;

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

本文出自 “ciyo技术分享” 博客,请务必保留此出处http://ciyorecord.blog.51cto.com/6010867/1930929

运算符