第二章 Java基础语法(7)

2.6.5              逻辑运算符

首先,先简要介绍逻辑运算符的种类:与、或、异或、非。一共四个运算符,它们的运算规则如下所示:

 

 

异或

 

 

 

逻辑运算符两边的操作数都必须是布尔(boolean)型数据,而最后产生的结果也是布尔值。

Java也提供了和上述四种运算相符的运算符,不过情况稍微特殊一些,里面一共包括了&&(与)、 ||(或)、 ^(异或) !(非)、,&(与) 以及 |(或) 等六种逻辑运算符。细心一点的读者能发现&&&都表示“与”运算,||| 都表示“或”运算。那么他们之间有什么区别?其实,&&||就是所谓的“短路逻辑运算符”——学过C语言的人对此应该不陌生的。为了说明什么是“短路逻辑运算符”,我们先看看下面几个例子:

int i = 10,j=20;

boolean b = i++ < 5 && j++ > 10; 

//思考1:运行到此处,bij的值分别是多少?

i = 10, j = 20;

b = i++ > 5 || j++<10;

//思考2:运行到此处,bij的值又该是多少?

对于第一个问题,答案是false620;而第二问题的答案则是true6 20。这里需要我们关注的是j的值,在上面的两段程序中,j的值都没有被自加,而原因就在于“短路逻辑运算符上”:所谓的短路,就是说当&&||这两个运算符左边的结果能最终决定整个逻辑表达式的结果时,则不会再浪费时间对运算符右边进行计算了。因此,当&&左边的结果为false,而||左边的结果为true时,它们右边不管有什么东西,都被一一忽略了。如果大家有兴趣还可以试着把上面例子里的短路运算符分别换成&|运算符,看看最后bij的值分别是多少。

最后,大家轻松一下,问一个微软面试题:一个人走到路口,有两条路可以走,但是只有其中一条路是正确的,而这时路旁有两个人,其中一个人说真话,另外一个人说假话。问:只能问其中一个人一句话,怎么能得到正确答案?给一个提示:利用false && true==false以及true && false==false的运算规则。要是想不出的话,就去网上搜一搜,J。毕竟,我们还要花时间继续往下看。

2.6.6      移位运算符

这一节的移位运算符和下一节的位操作符处于有点尴尬的位置。这两种操作符很有用,特别是在某些算法时,利用它们可以提高整个算法的效率;可是对于大多数程序员来说,这个东西有点像屠龙之技——平时没什么机会用得上。不管怎么说,还是要简单介绍一下,如果想进一步的了解,可以去看看其他的书籍。

一共有三个移位运算符:>>>>> <<>>是有符号右移运算符,>>>是无符号右移运算符,而<<是左移运算符。移位运算符左边放置的是待移位数据,而右边放置移位的位数。例如 200>>4,表示将200做有符号右移4位;而256<<3表示将256左移3位。

我们先看有符号右移,有符号右移相当于做除法,200>>2 等价于 200/24,最后的结果等于12(记住我们这可是在做整数的除法)。再给一个例子: -167>>2等价于-167/22,最后结果等于-42。而左移运算符相当于做乘法,256<<3等价于256*23,最后结果等于2048。而对于无符号右移,我这里还是不介绍了,有兴趣的人可以去看看其他的书籍。下面是移位运算的例子。

int i = 400; 

int j = i >> 3;  // 相当于 j = i / 8;

int k = i << 3;  // 相当于 k = i * 8;

有人会问,既然移位运算符等价于做乘法和除法,那么是否可以用算术运算符替代移位运算?答案是否定的,因为移位运算符的速度高于相应的算术运算符,因此在设计一些算法时,使用移位运算符能提高算法的效率。

 

你可能感兴趣的:(java,算法,面试,J#)