iOSViewJava技术文章代码改变世界

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

2015-05-28  本文已影响908人  许宏川

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

布尔类型##

布尔类型(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);

运行结果:
<pre>
true
false
</pre>

关系运算符##

关系运算符用于判断两个变量或常量之间的关系,其结果就是一个布尔值“true”或者“false”。所以关系运算符和布尔类型可以说是形影不离。
Java中有以下关系运算符:
<pre>
<code>></code>: 判断运算符左边的值是否大于右边的值。eg:<code>2 > 1</code>的结果是true。

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

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

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

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

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

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

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

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

运行结果:
<pre>
true
false
</pre>

逻辑运算符###

逻辑运算符比较两个布尔值的结果。
Java中有以下逻辑运算符:
<pre>
<code>!</code>:非,对运算符右边的布尔值取反。eg:<code>!true</code>结果为false,<code>!false</code>结果为true。

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

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

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

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

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

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

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

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

运行结果:
<pre>
false
true
</pre>

位运算符##

位运算符用于操作整数型的数据,而且是直接操作二进制数。注意,只能用于整数(char也是整数哦)。
Java中有以下逻辑运算符:
<pre>
<code>&</code>:与,若两个操作数都为1,则结果为1,否则为0。

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

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

<code>~</code>:取反,1变0。0变1。

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

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

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

示例代码:

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));

运行结果:
<pre>
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
</pre>

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

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

运行结果:
<pre>
(byte)-11 >>> 2 = 1073741821
</pre>

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

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


本文代码下载:百度网盘

上一篇 下一篇

猜你喜欢

热点阅读