Skip to content

Commit

Permalink
[modify 04](截至 第4章 移位运算符)
Browse files Browse the repository at this point in the history
  • Loading branch information
xiangflight committed May 31, 2019
1 parent e441af7 commit 5098efc
Showing 1 changed file with 14 additions and 14 deletions.
28 changes: 14 additions & 14 deletions docs/book/04-Operators.md
Original file line number Diff line number Diff line change
Expand Up @@ -614,8 +614,8 @@ public class Underscores {

[1] 注意 `%n`的使用。熟悉 C 风格的程序员可能习惯于看到 `\n` 来表示换行符。问题在于它给你的是一个“Unix风格”的换行符。此外,如果我们使用的是 Windows,则必须指定 `\r\n`。这种差异的包袱应该由编程语言来解决。这就是Java用 `%n` 实现的可以忽略平台间差异而生成适当的换行符,但只有当你使用 `System.out.printf()``System.out.format()` 时。对于 `System.out.println()`,我们仍然必须使用 `\n`;如果你使用 `%n``println()` 只会输出 `%n` 而不是换行符。


<!-- Exponential Notation -->

### 指数计数法

指数总是采用一种我认为很不直观的记号方法:
Expand Down Expand Up @@ -643,38 +643,38 @@ public class Exponents {
4.7E48
```

在科学与工程学领域,“e”代表自然对数的基数,约等于 2.718 (Java 一种更精确的 **double** 值采用 **Math.E** 的形式)。它在类似 “1.39×e 的 -47 次方”这样的指数表达式中使用,意味着“1.39×2.718 的-47次方”。然而,自 FORTRAN 语言发明后,人们自然而然地觉得e 代表 “10几次幂”。这种做法显得颇为古怪,因为 FORTRAN 最初面向的是科学与工程设计领域
在科学与工程学领域,**e** 代表自然对数的基数,约等于 2.718 (Java 里用一种更精确的 **double** **Math.E** 来表示自然对数)。指数表达式 "1.39 x e-43",意味着“1.39 × 2.718 的-43次方”。然而,自 FORTRAN 语言发明后,人们自然而然地觉得e 代表 “10的几次幂”。这种做法显得颇为古怪,因为 FORTRAN 最初是为科学与工程领域设计的

理所当然,它的设计者应对这样的混淆概念持谨慎态度 [^2]。但不管怎样,这种特别的表达方法在 C,C++ 以及现在的 Java 中顽固地保留下来了。所以倘若习惯 e 作为自然对数的基数使用,那么在 Java 中看到类似“1.39e-47f”这样的表达式时,请转换你的思维,从程序设计的角度思考它;它真正的含义是“1.39×10 的-47次方”。
理所当然,它的设计者应对这样的混淆概念持谨慎态度 [^2]。但不管怎样,这种特别的表达方法在 C,C++ 以及现在的 Java 中顽固地保留下来了。所以倘若习惯 e 作为自然对数的基数使用,那么在 Java 中看到类似“1.39e-43f”这样的表达式时,请转换你的思维,从程序设计的角度思考它;它真正的含义是“1.39 × 10的-43次方”。

注意如果编译器能够正确地识别类型,就不必使用尾随字面值常量。对于下述语句:
注意如果编译器能够正确地识别类型,就不必使用后缀字符。对于下述语句:

```java
long n3 = 200;
```

它并不存在含糊不清的地方,所以 200 后面的 L 大可省去。然而,对于下述语句:

```java
float f4 = 1e-43f; //10 的幂数
```
float f4 = 1e-47f; //10 的幂数
```

编译器通常会将指数作为 **double** 类型来处理,所以假若没有这个尾随的 `f`,编辑器就会报错,提示我们应该将 **double** 型转换成 **float** 型。

编译器通常会将指数作为 **double** 类型来处理,所以假若没有这个后缀字符 `f`,编译器就会报错,提示我们应该将 **double** 型转换成 **float** 型。

<!-- Bitwise-Operators -->
## 按位运算符

## 位运算符


按位运算符允许我们操作一个整数基本类型中的单个“比特”位,即二进制位。按位运算符会对两个自变量中对应的位执行布尔代数,并最终生成一个结果
位运算符允许我们操作一个整型数字中的单个二进制位。位运算符会对两个整数对应的位执行布尔代数,从而产生结果

按位运算来源自 C 语言的底层操作。我们经常要直接操纵硬件,频繁设置硬件寄存器内的二进制位。Java 的设计初衷是电视机顶盒嵌入式开发,所以这种底层的操作被仍被保留了下来。然而,随着操作系统的进步,现今已没必要过于频繁地进行按位运算了
位运算源自 C 语言的底层操作。我们经常要直接操纵硬件,频繁设置硬件寄存器内的二进制位。Java 的设计初衷是电视机顶盒嵌入式开发,所以这种底层的操作仍被保留了下来。但是,你可能不会使用太多位运算

若两个输入位都是 1,则按位“与运算符” `&` 在输出位里生成一个 1 ;否则生成 0。若两个输入位里至少有一个是 1,则按位“或运算符” `|` 在输出位里生成一个 1;只有在两个输入位都是 0 的情况下,它才会生成一个 0。若两个输入位的某一个是 1,但不全都是 1,那么按位“异或运算符” `^` 才会在输出位里生成一个 1。按位“非运算符” `~` 属于一元运算符;它只对一个自变量进行操作(其他所有运算符都是二元运算符)。按位非运算生成与输入位的相反的值。例如,若输入 0,则输出 1;输入 1,则输出 0。
若两个输入位都是 1,则按位“与运算符” `&` 运算后结果是 1,否则结果是 0。若两个输入位里至少有一个是 1,则按位“或运算符” `|` 运算后结果是 1;只有在两个输入位都是 0 的情况下,运算结果才是 0。若两个输入位的某一个是 1,另一个不是 1,那么按位“异或运算符” `^` 运算后结果才是 1。按位“非运算符” `~` 属于一元运算符;它只对一个自变量进行操作(其他所有运算符都是二元运算符)。按位非运算后结果与输入位相反。例如输入 0,则输出 1;输入 1,则输出 0。

按位运算符和逻辑运算符都使用了同样的字符,只不过数量不同。“按位”短“移位”长。按位运算符可与等号 `=` 联合使用以接收结果及赋值:`&=``|=``^=` 都是合法的(由于 `~` 是一元运算符,所以不可与 `=` 联合使用)。
位运算符和逻辑运算符都使用了同样的字符,只不过数量不同。位短,所以位运算符只有一个字符。位运算符可与等号 `=` 联合使用以接收结果及赋值:`&=``|=``^=` 都是合法的(由于 `~` 是一元运算符,所以不可与 `=` 联合使用)。

我们将 **Boolean** 类型被视为“单位值”(one-bit value)对待,所以它多少有些独特的地方。我们可以执行按位“与”、“或”、“异或”,但不能执行按位“非”(大概是为了避免与逻辑“非”混淆)。对于布尔值,按位运算符具有与逻辑运算符相同的效果,只是它们不会中途“短路”。此外,针对布尔值进行的按位运算为我们新增了一个“异或”逻辑运算符,它并未包括在“逻辑”运算符的列表中。在移位表达式中,禁止使用布尔运算,原因将在下面解释。
我们将 **Boolean** 类型被视为“单位值”(one-bit value),所以它多少有些独特的地方。我们可以对 boolean 型变量执行与、或、异或运算,但不能执行非运算(大概是为了避免与逻辑“非”混淆)。对于布尔值,位运算符具有与逻辑运算符相同的效果,只是它们不会中途“短路”。此外,针对布尔值进行的位运算为我们新增了一个“异或”逻辑运算符,它并未包括在逻辑运算符的列表中。在移位表达式中,禁止使用布尔值,原因将在下面解释。


<!-- Shift Operators -->
Expand Down

0 comments on commit 5098efc

Please sign in to comment.