在程序里进行真假对错的逻辑运算时非常平常的事,那就需要有数据类型和运算符来进行值存储和计算。这些就是下面有讲的内容。
布尔类型##
布尔类型(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 = 11 | -1 = -1
1 | 11111111111111111111111111111111 = 111111111111111111111111111111111 ^ -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了。
到此为止已经讲完了下图绿色部分的数据类型和所有的运算符。
本文代码下载:百度网盘