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 ;
上面代码实际需要做的是将i和j之间那个比较大的赋值给max。由于条件i>j为true,因此返回i的值,因此max最终等于20。
三元运算符属于常使用的那一类运算符,对于一个有经验的程序员来说,使用三元运算符替代简单的if……else语句可以使语句变得更为简单一些(当然,在新手面前,这样会显得比较酷一些)。不过,使用三元运算符也需要谨慎,有时候过度的使用也会造成降低代码的可维护性。看看下面这个:
int min = (x<y)?(x<z)?x:z:(y<z)?y:z;
有没有被上面这个搞糊涂?这个表达式用于求x,y和z之间最小的那个数。而实际上,这还不算是一个非常复杂的表达式。如果再写复杂,那么三元表达式就丧失了它的简单特性了。
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”进行连接。