第二章 Java基础语法(8)

 2.6.7   位运算符

 

Java中共包含四个位运算符:~(取反),&(与),|(或)和 ^(异或)。我们应该还记得,&| ^在逻辑运算符中也扮演了角色的。在这他们也拥有和逻辑运算符中相同的名字,实际上,位运算符和逻辑运算符的运算规则从本质上是完全相同的。下面列出了位运算符的运算规则。

 

&

0

1

 

|

0

1

0

0

0

0

0

1

1

0

1

1

1

1

 

^

0

1

 

0

1

0

0

1

 

1

1

1

1

0

 

 

不过了解这些运算规则仅仅是了解位运算的开始,我们还需要了解更多的内容,比如二进制与十进制之间的转换,原码、反码、补码的表示等等。在本书中,我们把重点放在Java的介绍上,因此我们就不对这些内容做详细介绍,如果需要学习这些内容的话,可以参考一下其他的书籍。

 

最后,给出几个相关例子,大家可以熟悉一下位运算符的用法。

 

public class BitOpTester { 

  public static void main(String[] args) {

    int i1 = -14;

    int i2 = 15;

    int j = ~i1;

    int k = i1 & i2;

    int m = i1 | i2;

    int n = i1 ^ i2;

    System.out.println(j + ", " + k + ", " + m + ", " + n); //结果为:13, 2, -1, -3

  }

}

 2.6.8    三元运算符

 

这个运算符的名字非常难取,按照C语言的中文译名,我在这里也给用了“三元运算符”这个名字,但从运算符的特征来讲,取名“if-else运算符更为恰当一些”。这个运算符的语法如下:

 

布尔表达式?值1:值2

 

意思是:如果表达式的结果为true,则返回值1,否则返回值2。看看下面这几个例子:

 

int i = 20;

int j = 15;

int max = (i>j) ? i:j ;

 

上面代码实际需要做的是将ij之间那个比较大的赋值给max。由于条件i>jtrue,因此返回i的值,因此max最终等于20

 

三元运算符属于常使用的那一类运算符,对于一个有经验的程序员来说,使用三元运算符替代简单的if……else语句可以使语句变得更为简单一些(当然,在新手面前,这样会显得比较酷一些)。不过,使用三元运算符也需要谨慎,有时候过度的使用也会造成降低代码的可维护性。看看下面这个:

 

int min = (x<y)?(x<z)?x:z:(y<z)?y:z;

 

有没有被上面这个搞糊涂?这个表达式用于求xyz之间最小的那个数。而实际上,这还不算是一个非常复杂的表达式。如果再写复杂,那么三元表达式就丧失了它的简单特性了。

 2.6.9    与“=”号联合使用

 

在程序中,我们经常会使用下面的表达式:

 

i = i + 10;

j = j - 5;

 

当碰到这些语句时,我们可以使用运算符和“=”的联合运算符来优化我们的代码,在Java中常见有如下联合赋值运算符:+=-=*=/=%=&=|=<<=>>=>>>=等。以+=为例,i += 5 等价于 i=i+5。而上面的代码也可以利用联合运算符转变为如下代码段:

 

i += 10;

j -= 5;

 

可能有读者会问,除了看上去更简单一些,联合运算符还有什么优势呢?由于Java虚拟机针对联合运算符的操作与普通的赋值运算符有区别,而联合运算符的速度更快,因此从性能上考虑的话,也更建议使用联合运算符。

 2.6.10 +”另一个作用:字符串连接

 

在前文已经介绍“+”是加法运算符,可以对两个数值型数据进行加法运算。实际上,除了这个作用之外,“+”还能作为字符串的连接运算符。例如下面的例子:

 

String str = “hello,” + “world”;

 

在上面的代码中“+”运算符将字符串”hello,””world”连接在一起组成新字符串”hello,world”。有些人可能会问,既然字符串不是基本数据类型,那为什么要使用“+”运算符进行字符串连接的操作呢?其实原因我们在前文中就提到过:因为字符串使用非常频繁,而字符串的连接又是字符串中最为常见的操作,因此有必要使用一些方式简化字符串的连接。

 

不过,“+”号可不仅仅只能用在字符串的连接上,它还能处理非字符串数据和字符串的连接。由于字符串的高使用率与通用性,因此在Java中有这样一个规定:只要“+”某一端是一个字符串,那么另一端的数据将会转换成字符串,然后再和这个字符串连接。也就是说:字符串达到“见谁灭谁”的境界了。让我们通过上面的几个例子来感受一下字符串类型的强大:

 

public class StrUnionTester {

  public static void main(String[] args) {

    String str = null;   

    str = "hello" + 1.0; // 结果为:hello1.0

    System.out.println(str);

    str = "hello" + true; //结果为:hellotrue

    System.out.println(str);

    str = "hello" + 1 + 2 + 3;  //结果为:hello123

    System.out.println(str);

    str = 1 + 2 + 3 + “hello”;  //结果为:6hello

    System.out.println(str);

  }

}

 

可能有人为str=1+2+3+hello;的结果感到迷惑——结果为什么不是123hello?这里的奥秘在于“+”号:要注意,当+两边都是数值类型的时候,它就是一个简单的加法运算符,因此我们要先进行1+2+3的运算,然后再和字符串“hello”进行连接。

 

你可能感兴趣的:(java)