8. Java运算符

转载自:http://my.oschina.net/brucelee80/blog

Java运算符

分类   运算符 例子

后缀

自增(先用后增):
表达式++

自减(先用后减):
表达式--


int i = 0; 
int j = i++; 
// 最终结果:i是1,j是0,i先赋给j再自增1 

int k = 0;
boolean b = k++ == 1; 
// 最终结果:k是1,b是false,k先与1比较再自增1


一元

自增(先增后用):
++表达式

自减(先减后用):
--表达式

取正:+表达式

取负:-表达式

按位非:~

逻辑非:!


int i = 0; 
int j = ++i; 
// 最终结果:i是1,j是1 

int k = 0; 
boolean b = ++k == 1; 
// 最终结果:k是1,b是true 

int i = -1; // 负1 
int j = -i; // 正1


算数

加法:+
(在一元中已出现)

减法:-
(在一元中已出现)

乘法:*

除法:/

取余:%

字符串连接:+


int i = 10/3; 
// i是3 

double d = 10/3.0; 
// d是3.333... 

int j = 10%3; 
// j是1 

int k = 1; 
boolean b = true; 
String s = k +"-"+ b; 
// s是 1-true


位移

带符号左移:<<

带符号右移:>>

无符号右移:>>>

<<  左移后低位补0

>>  若为正数,右移后高位补0,若为负数,右移后高位补1

>>> 无论正负,右移后高位补0

参考后附

关系

小于:<

大于:>

小于等于:<=

大于等于:>=

相等:==

不等:!=

类型比较:instanceof

关系运算符返回值是布尔值

boolean b = "" instanceof String; // b是true

关于==:
对于基本数据类型,它比较的是两个值是否相等。
对于引用数据类型,比较的是内存地址是否是同一个;
如果要比较引用数据类型的内容,则可调用equals方法,
当然你还必须重写equals方法,
否则,equals默认仍旧比较的是内存地址。

按位与:&

按位异或:^

按位或:|

按位非:~
(在一元中已出现)

 参考后附

逻辑

与:&

或:|

短路与:&&

短路或:||

逻辑非:!
(在一元中已出现)

短路的逻辑运算:
如果逻辑运算的结果已经确定,那之后的表达式就不执行;
而非短路的逻辑运算,所有的表达式都会执行。
相比而言,短路逻辑运算可以提高运算效率。

int i = 1; int j = 1; 
boolean b = (++i == 2) || (--j == 2); 
System.out.println(i+":"+j);// 打印2:1


因为(++i == 2)是true,这时就可以确定b的值是true,
使用短路或的话,--j == 2就不会再执行,所以j仍是1。

如果把短路或“||”换成非短路或“|”,
那么打印2:0,因为—j ==2 扔会执行。

三元

if then else:?:

类似if then else,布尔表达式?值1:值2
如果布尔表达式是true取值1,否则取值2

int i = true ? 1 : 2; 
//i是1


赋值

赋值:=

扩展赋值:
+=
-=
*=
/=
%=
&=
^=
|=
<<=
>>=
>>>=


int i = 1; 
i = 2; 
i += 3; 
// 其实就是i = i+3;


说明

  1. i++,表示先先使用i的值,使用完成后,i自增;
  2. ++i,表示先i自增,再使用i的值;
  3. &&短路与,当第一个值可以决定最后值时,就不计算第二个值;
  4. =表示赋值,==表示判断是否相等
  5. 字符串连接符+,只要其中之一是字符串,系统会自动将另一个操作数转换为字符串; 
  6. 三目运算符x?y:z,String type = score<60 ? ”不及格” : ”及格”;
  7. 不必刻意去记忆运算符优先顺序,如果运算符过多,用( )括起即可让顺序不乱。

按位操作符

按位和移位都不太常用,仅供参考
按位操作符用来操作整数基本数据类型中的单个“比特”(bit),即二进制位。
注意,如果操作的两个数是布尔型,那它就是逻辑操作符而非按位操作符

按位与&
如果两个输入位都是1
则结果是1
按位或|
只要有一个是1
则结果是1
按位异或^
某一个是1但不全都是1
则结果是1
按位非~
取反操作
0 & 0 = 0 0 | 0 = 0 0 ^ 0 = 0 ~0 = 1
0 & 1 = 0 0 | 1 = 1 0 ^ 1 = 1 ~1 = 0
1 & 0 = 0 1 | 0 = 1 1 ^ 0 = 1  
1 & 1 = 1 1 | 1 = 1 1 ^ 1 = 0

举例:
//0b1的写法Java7支持
int i = 0b010;
int j = 0b110;
System.out.println(Integer.toBinaryString(i & j)); // 010
System.out.println(Integer.toBinaryString(i | j)); // 110
System.out.println(Integer.toBinaryString(i ^ j)); // 100
System.out.println(Integer.toBinaryString(~i)); // 1...01

移位操作符

System.out.println(Integer.toBinaryString(0b1 << 1)); // 10,低位补0
System.out.println(Integer.toBinaryString(0b1 >> 1)); // 0,正数则高位补0

System.out.println(Integer.toBinaryString(-0b1)); // -1的二进制表示是32个1
System.out.println(Integer.toBinaryString(-0b1 >> 1)); // 仍旧是32个1,负数则高位补1
System.out.println(Integer.toBinaryString(-0b1 >>> 1)); // 31个1,无符号右移,高位都补0

如果对byte或short值进行移位运算,它们首先会被转换成int类型,再进行右移操作,然后把这个int再截断赋给byte或short,这种情况下,可能会得到-1。

byte b = -1;// 二进制是8个1
b >>>= 10;// 首先转成int,即32个1,无符号右移变成22个1,但byte只能截取8位1
System.out.println(b);// 8个1是-1,所以结果扔是-1
转载自:http://my.oschina.net/brucelee80/blog

你可能感兴趣的:(java运算符,Java按位运算符,Java位移运算符)