Java运算符

1.运算符

1.1算术运算符

+(加)  -(减)  *(乘)  /(除)  %(取余)

 

如:

int a = 5+4//a=9

int b = a*2//b=18

int c = b/4//c=4

int d = b-c//d=14

int e = -d//e=-14

int f = e%4//f=-2

1.2赋值运算符

=   +=   -=  *=  /=  %=  <<=  >>=   &=  |=  ^=

1.3短路运算符

与(&&)、或(||

 

&& :它表示的是:当左边的表达是是false的话,右边的表达式将不进行运算

||   :表示:当左边的表达是为true的话,右边的表达式将不进行运算

1.4关系运算符

等于符号:==     不等于符号:!=           大于符号:>

小于符号:<       大于等于符号:>=        小于等于符号:<= 

 

例如:

9.5<8;        //false

8.5<=8.5;     //true

'A' < 'a');     //false

1.5条件运算符(三目运算符)

?:  

 

例如:a>b?true:false 说明:当a大于b的时候,为true(也就是冒号之前的值),否则为false;这整个运算符包括一个关系运算符(可以是“>”"<""!="等等),一个,一个,冒号前后需要有两个表达式或者是值或者是对象。

 

1.6自加减运算符

++(自增)  - -(自减)

 

例如:

int i = 0;       //i=0
int j = i++;     //j=0
int k = --i;     //k=0

1.7正负号运算符

+(取正)  -(取负)

1.8位移运算符

<< 带符号左移       >>带符号右移           >>> 无符号右移

左移运算符:

1)它的通用格式如下所示:
value << num
num 指定要移位值value 移动的位数。
左移的规则只记住一点:丢弃最高位,0补最低位
如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了332=1位。

2)运算规则
按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
当左移的运算数是int 类型时,每移动1位它的第31位就要被移出并且丢弃;
当左移的运算数是long 类型时,每移动1位它的第63位就要被移出并且丢弃。
当左移的运算数是byte short类型时,将自动把这些类型扩大为 int 型。

3)数学意义
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以21次方,左移n位就相当于乘以2n次方

4)计算过程:
例如:3 <<2(3int)
1)把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011
2)把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,
3)在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100
转换为十进制是12

移动的位数超过了该类型的最大位数,
如果移进高阶位(3163位),那么该值将变为负值。下面的程序说明了这一点:

// Left shifting as a quick way to multiply by 2.
public class MultByTwo {
public static void main(String args[]) {
   int i;
   int num = 0xFFFFFFE;
   for(i=0; i<4; i ) {
       num = num << 1;
     System.out.println(num);
   }
  }
}

该程序的输出如下所示:

536870908
1073741816
2147483632
-32
注:n位二进制,最高位为符号位,因此表示的数值范围-2^(n-1) ——2^(n-1) -1,所以模为2^(n-1)

右移运算符

右移运算符<<使指定值的所有位都右移规定的次数。

1)它的通用格式如下所示:

value >> num

num 指定要移位值value 移动的位数。

右移的规则只记住一点:符号位不变,左边补上符号位

2)运算规则:

按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1

当右移的运算数是byte short类型时,将自动把这些类型扩大为 int 型。

例如,如果要移走的值为负数,每一次右移都在左边补1,如果要移走的值为正数,每一次右移都在左边补0,这叫做符号位扩展(保留符号位)(sign extension ),在进行右移

操作时用来保持负数的符号。

 

3)数学意义

右移一位相当于除2,右移n位相当于除以2n次方。

4)计算过程

11 >>2(11int)

1)11的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011

2)把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。

3)最终结果是0000 0000 0000 0000 0000 0000 0000 0010

转换为十进制是3

35 >> 2(35int)

35转换为二进制:0000 0000 0000 0000 0000 0000 0010 0011

把低位的最后两个数字移出:0000 0000 0000 0000 0000 0000 0000 1000

转换为十进制: 8

5)在右移时不保留符号的出来

右移后的值与0x0f进行按位与运算,这样可以舍弃任何的符号位扩展,以便得到的值可以作为定义数组的下标,从而得到对应数组元素代表的十六进制字符。

例如

public class HexByte {

public static public void main(String args[]) {

char hex[] = {

'0', '1', '2', '3', '4', '5', '6', '7',

'8', '9', 'a', 'b', 'c', 'd', 'e', 'f''

};

byte b = (byte) 0xf1;

System.out.println("b = 0x" hex[(b >> 4) & 0x0f] hex[b & 0x0f]);}}

(b >> 4) & 0x0f的运算过程:

b的二进制形式为:1111 0001

4位数字被移出:0000 1111

按位与运算:0000 1111

转为10进制形式为:15

b & 0x0f的运算过程:

b的二进制形式为:1111 0001

0x0f的二进制形式为:0000 1111

按位与运算:0000 0001

转为10进制形式为:1

所以,该程序的输出如下:

b = 0xf1

无符号右移

无符号右移运算符>>>

它的通用格式如下所示:

value >>> num

num 指定要移位值value 移动的位数。

无符号右移的规则只记住一点:忽略了符号位扩展,0补最高位

无符号右移运算符>>> 只是对32位和64位的值有意义

1.9逻辑运算符

&&(短路与)  ||(短路或)  !(非) &(与)  |(或)

 

!:这个没说的就是非运算符

& :无论左边的表达式结果是:true还是false,右边的表达式都会进行运算

|  :表示无论左边的表达式结果是:true还是false,右边的表达式都将进行运算

&& :它表示的是:当左边的表达是是false的话,右边的表达式将不进行运算

||   :表示:当左边的表达是为true的话,右边的表达式将不进行运算

1.10位运算符

  与(&)、非(~)、或(|)、异或(^

 

&:双目运算符,运算时均把运算数转换为二进制再做比较,规则:当相同的位上均为1时结果为1,否则结 果为0.如:1010&1101,转为二进制:1111110010&10001001101,比较结果为:1000000转为十进制: 64。所以1010&1101=64

| :当两边操作数的位有一边为1时,结果为1,否则为0。如1100|1010=1110

~01,10

^:两边的位不同时,结果为1,否则为0.1100^1010=0110

1.11new

new 关键字用来在堆中申请空间

 

如:str = new String("Hello!");

1.12instanceof

运算符双目运算符,左面的操作元是一个对象,右面是一个类或接口。当左面的对象是右面的类(或右边类的子孙类)创建的对象、或者是右边接口的实现类(或实现类的子孙类)的对象时,该运算符运算结果是true,否则是false

1.13()

()用于强制类型转换和改变执行优先权;如:

int i=1;

long l=(long)i;

注意:Java语言和解释器限制使用强制和转换,以防止出错导致系统崩溃。整数和浮点数运算符间可以来回强制转换,但整数不能强制转换成数组或对象。对象不能被强制为基本类型。

Java中整数运算符在整数运算时,如果操作数long类型,则运算结果是long类型,否则为int类型,绝不会是byteshortchar型。这样,如果变量i被声明为shortbytei+1的结果会是int。如果结果超过该类型的取值范围,则按该类型的最大值取模。

1.14[ ]

[]用于通过其内部下标取出数组内对应值

1.15.

.Java中,用来区别包名和类名,以及区别类名与它们的公共方法和属性名字。

 

现在看下面的语句:

int[ ] array = { 4, 99, 32, 11, 0, 75, 6 };

java.util.Arrays.sort(array);

这里有个被Arrays工具类的sort方法调用的整数数组。点符号把包名(java.util)和类名(Arrays)区分开来,也把Arrays类名和sort方法名分离开了。

 

 

 

 

2优先级与结合性

优先级

运算符

结合性

1

()[].

从左向右

2

!+(正)-(负)~ ++ --

从右向左

3

* / %

从左向右

4

+(加)-(减)

从左向右

5

<<      >>      >>>   

从左向右

6

<     <=     >     >=     instanceof

从左向右

7

==    !=

从左向右

8

&(按位与)

从左向右

9

^

从左向右

10

|

从左向右

11

&&

从左向右

12

||

从左向右

13

?:

从右向左

14

=   +=  -=   *=   /=   %=   &=  |=   ^=   ~=  <<=  >>=  >>>=

从右向左

posted @ 2017-01-11 16:32  岁月_匆匆  阅读(260)  评论(0编辑  收藏  举报