大于、小于的运算会了,但如果想要同时进行两个以上的条件判断呢?例如分数大于80但小于90的判断,在逻辑上有所谓的“且”、“或”与“反”,在
Java中也提供这几个基本逻辑运算所需的“逻辑运算符”(Logical
operator),分别为“且”(&&)、
“或”(||)及“反相”(!)三个运算符。 来看看下面这个程序会输出什么? int number = 75;
System.out.println((number > 70 && number < 80)); System.out.println((number > 80 || number < 75)); System.out.println(!(number > 80 || number < 75)); 三段程序分别会输出true、false与true三种状况。 接下来看看“位元运算符”(Bitwise operator),在 数位设计上有AND、OR、NOT、XOR与补数等运算,在Java中提供这些运算的就是位元运算符,它们的对应分别是 AND (&)、OR(|)、XOR(^)与补数(~)。 如果您不会基本的位元运算,以下可以提供一个程序来显示各个运算的结果:
public class BitwiseOperator { 执行结果:
Java中的位元运算是逐位元运算的,例如10010001与01000001作AND运算,是一个一个位元对应运算,答案就是00000001;而补数 运算是将所有的位元0变1,1变0,例如00000001经补数运算就会变为11111110,例如下面这个程序所示: byte number = 0;
System.out.println((int)(~number)); 这个程序会在主控台显示-1,因为byte占内存一个位元组,它储存的0在内存中是00000000,经补数运算就变成11111111,这在电脑中 用整数表示则是-1。 要注意的是,逻辑运算符与位元运算符也是很常被混淆的,像是&&与 &,||与|,初学时可得多注意。 位元运算对初学者来说的确较不常用,但如果用的恰当的话,可以增进不少程序效率,例如下面这个程序可以判断使用者的输入是否为奇数:
import java.util.Scanner; 执行结果:
这个程序得以运算的原理是,奇数的数值若以二进位来表示,其最右边的位元必为1,而偶数最右边的位元必为0,所以我们使用1来与输入的值作AND运算,由 于1除了最右边的位元为1之外,其它位元都会是0,与输入数值AND运算的结果,只会留下最右边位元为0或为的结果,其它部份都被0 AND运算遮掉了,这就是所谓“位元遮罩”,例如: 00000100 -> 4 00000001 -> 1 ---------- 00000000 -> 判断为偶数 00000011 -> 3 00000001 -> 1 ---------- 00000001 -> 判断为奇数 XOR的运算较不常见,这边举个简单的XOR字节加密例子,先看看程序:
public class XorCode { 执行结果:
0x7是Java中整数的16进位写法,其实就是10进位的7,将位元与1作XOR的作用其实就是位元反转,0x7的最右边三个位元为1,所以其实就是反 转ch的最后两个位元,如下所示: 01000001 -> 65 -> 对应ASCII中的'A' 00000111 -> 0x7 ---------- 01000110 -> 70 -> 对应ASCII中的'F' 同样的,这个简单的XOR字节加密,要解密也只要再进行相同的位元反转就可以了。 要注意的是,虽然在说明时都只取8个位元来说明,但实际的位元在运算时,需依数据类型所占的内存长度而定,例如在使用int类型的0作运算时,要考虑的 是32个位元,而不是只有8个位元,因为int占有4个位元组。 在位元运算上,Java还有左移(<<)与右移(>>)两个运算符,左移运算符会将所有的位元往左移指定的位 数,左边被挤出去的位元会被丢弃,而右边会补上0;右移运算则是相反,会将所有的位元往右移指定的位数,右边被挤出去的位元会被丢弃,至于左边位元补0或 补1 则视最左边原来的位元而定,如果原来是0就补0,是1就补1,您还可以使用>>>运算符,这个运算符在右移后一行在最左边补上0。 可以使用左移运算来作简单的2次方运算示范,如下所示:
public class ShiftOperator { 执行结果:
实际来左移看看就知道为何可以如此运算了: 00000001 -> 1 00000010 -> 2 00000100 -> 4 00001000 -> 8 |