【精致Java教程】12:常量、变量与运算符(三)

在程序里进行真假对错的逻辑运算时非常平常的事,那就需要有数据类型和运算符来进行值存储和计算。这些就是下面有讲的内容。

布尔类型##

布尔类型(boolean)用于程序里用于表示逻辑上的“真”和“假”,boolean占1个字节,它只有“true”和“false”两个值。并且无法与其它基本数据类型进行转换。“true”和“false”是Java中的关键字,编译器一看到“true”和“false”就知道代表布尔值常量。

示例代码:

// 布尔类型的声明和初始化
boolean b1 = true;
boolean b2 = false;

// 可以直接输出boolean的值
System.out.println(b1);
System.out.println(b2);

运行结果:


true
false

关系运算符##

关系运算符用于判断两个变量或常量之间的关系,其结果就是一个布尔值“true”或者“false”。所以关系运算符和布尔类型可以说是形影不离。
Java中有以下关系运算符:


>: 判断运算符左边的值是否大于右边的值。eg:2 > 1的结果是true。

<: 判断运算符左边的值是否小于右边的值。eg:2 < 1的结果是false。

>=:判断运算符左边的值是否大于或者等于右边的值。eg:2 >= 2的结果是true。

<=:判断运算符左边的值是否小于或者等于右边的值。eg:2 <= 2的结果是true。

==:如果比较的是基本数据类型,判断运算符左右两边的值是否相等。eg:2 == 1的结果是false。如果比较的是引用数据类型,判断运算符左右两边的引用是否指向同一对象。以后再讲。

!=:如果比较的是基本数据类型,判断运算符左右两边的值是否不相等。eg:2 != 1的结果是true。如果比较的是引用数据类型,判断运算符左右两边的引用是否不指向同一对象。以后再讲。

既然关系运算的计算结果是一个布尔值,那么就把一个使用关系运算符的表达式赋值给boolean。
例如:

boolean b1 = 1 > 0.5;
boolean b2 = 1 == -1;

System.out.println(b1);
System.out.println(b2);

运行结果:


true
false

逻辑运算符###

逻辑运算符比较两个布尔值的结果。
Java中有以下逻辑运算符:


!:非,对运算符右边的布尔值取反。eg:!true结果为false,!false结果为true。

&:与,运算符两边的布尔值都为true时结果为true。eg:(true & true)结果为true,(false & true)结果为false。

|:或,运算符两边的布尔值有一个为true时结果为true。eg:(true | true)结果为true,(true | false)结果为true,(false | false)结果为false。

^:异或,运算符两边的布尔值相同时为true,eg:(true ^ false)结果为false,(false ^ false)结果为true。

&&:短路与,运算符两边的布尔值都为true时结果为true。和&的区别是只要如果第一个值为false结果就是false不会再去看第二个布尔值。eg:(false && true)结果为false,但是看到第一个是false时就不会去看第二个是true还是false了,因为结果已经确定为false。

||:短路或,运算符两边的布尔值有一个为true时结果为true。和|的区别是只要如果第一个值为true结果就是true不会再去看第二个布尔值。eg:(true || false)结果为true,但是看到第一个是true时就不会去看第二个是true还是false了,因为结果已经确定为true。

因为逻辑运算的结果也是布尔值,所以也可以把使用逻辑运算符的表达式赋值给boolean。这在后面的流程控制里很常用。
例如:

boolean b1 = (3 > 0) && (3 % 2 == 0);
boolean b2 = (-5 > -3) || (!false);

System.out.println(b1);
System.out.println(b2);

运行结果:


false
true

位运算符##

位运算符用于操作整数型的数据,而且是直接操作二进制数。注意,只能用于整数(char也是整数哦)。
Java中有以下逻辑运算符:


&:与,若两个操作数都为1,则结果为1,否则为0。

|:或,若两个操作数有一个为1,则结果为1,否则为0。

^:异或,若两个操作数相同,则结果为1,否则为0。

~:取反,1变0。0变1。

>>:右移,二进制数除符号位外集体向右移动指定位数,高位用0补齐。

<<:左移,二进制数除符号位外集体向左移动指定位数,低位用0补齐。

>>>:无符号右移,二进制数集体向右移动指定位数,高位用0补齐。

示例代码:

String b1 = Integer.toBinaryString(1); // 1的二进制形式,前面的0忽略
String b2 = Integer.toBinaryString(-1); // -1的二进制形式

System.out.println("1 & -1 = " + (1 & -1));
System.out.println(b1 + " & " + b2 + " = " + Integer.toBinaryString(1 & -1));
System.out.println(""); // 隔开一行

System.out.println("1 | -1 = " + (1 | -1));
System.out.println(b1 + " | " + b2 + " = " + Integer.toBinaryString(1 | -1));
System.out.println("");

System.out.println("1 ^ -1 = " + (1 ^ -1));
System.out.println(b1 + " ^ " + b2 + " = " + Integer.toBinaryString(1 ^ -1));
System.out.println("");

System.out.println("~-1 = " + ~-1);
System.out.println("~" + b2 + " = " + Integer.toBinaryString(~-1));
System.out.println("");

String b3 = Integer.toBinaryString(-11); // -11的二进制形式

System.out.println("-11 >> 2 = " + (-11 >> 2));
System.out.println(b3 + " >> 2 = " + Integer.toBinaryString(-11 >> 2));
System.out.println("");

System.out.println("-11 << 2 = " + (-11 << 2));
System.out.println(b3 + " << 2 = " + Integer.toBinaryString(-11 << 2)); System.out.println("");

System.out.println("-11 >>> 2 = " + (-11 >>> 2));
System.out.println(b3 + " >>> 2 = " + Integer.toBinaryString(-11 >>> 2));

运行结果:


1 & -1 = 1
1 & 11111111111111111111111111111111 = 1

1 | -1 = -1
1 | 11111111111111111111111111111111 = 11111111111111111111111111111111

1 ^ -1 = -2
1 ^ 11111111111111111111111111111111 = 11111111111111111111111111111110

~-1 = 0
~11111111111111111111111111111111 = 0

-11 >> 2 = -3
11111111111111111111111111110101 >> 2 = 11111111111111111111111111111101

-11 << 2 = -44
11111111111111111111111111110101 << 2 = 11111111111111111111111111010100

-11 >>> 2 = 1073741821
11111111111111111111111111110101 >>> 2 = 111111111111111111111111111101

这里还有一个注意事项,就是移位运算符也就是“>>”、“<<”和“>>>”这三个只能操作int和long,对byte、long、char会自动扩大为int处理。
示例代码:

byte b4 = -11;
System.out.println("(byte)-11 >>> 2 = " + (b4 >>> 2)); // 移位运算符只能操作int和long,byte、long、char会自动扩大为int处理。

运行结果:


(byte)-11 >>> 2 = 1073741821

按理说byte只有8位,-11的二进制应该是11110101,无符号右移两位应该是00111101也就是61。可是移位运算时把11110101扩大成32位的int了,也就是11111111111111111111111111110101。无符号右移2为就是111111111111111111111111111101(前面两个0省略,第一位为0变成正数)也就是1073741821了。

到此为止已经讲完了下图绿色部分的数据类型和所有的运算符。


【精致Java教程】12:常量、变量与运算符(三)_第1张图片
【精致Java教程】12:常量、变量与运算符(三)_第2张图片

本文代码下载:百度网盘

你可能感兴趣的:(【精致Java教程】12:常量、变量与运算符(三))