Skip to content

Commit b808420

Browse files
authored
修复优化高级运算符章节 (#1233)
* 修复斜体格式与理顺语句 * 修复图片链接
1 parent b9480f1 commit b808420

File tree

1 file changed

+17
-17
lines changed

1 file changed

+17
-17
lines changed

source/02_language_guide/27_Advanced_Operators.md

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ Swift 支持 C 语言中的全部位运算符,接下来会一一介绍。
1616

1717
### Bitwise NOT Operator(按位取反运算符) {#bitwise-not-operator}
1818

19-
*按位取反运算符(`~`*对一个数值的全部比特位进行取反:
19+
*按位取反运算符(`~`* 对一个数值的全部比特位进行取反:
2020

21-
![Art/bitwiseNOT_2x.png](https://docs.swift.org/swift-book/_images/bitwiseNOT_2x.png)
21+
![Art/bitwiseNOT_2x.png](https://docs.swift.org/swift-book/images/bitwiseNOT@2x.png)
2222

2323
按位取反运算符是一个前缀运算符,直接放在运算数之前,并且它们之间不能添加任何空格:
2424

@@ -35,7 +35,7 @@ let invertedBits = ~initialBits // 等于 0b11110000
3535

3636
*按位与运算符(`&`* 对两个数的比特位进行合并。它返回一个新的数,只有当两个数的对应位**`1` 的时候,新数的对应位才为 `1`
3737

38-
![Art/bitwiseAND_2x.png](https://docs.swift.org/swift-book/_images/bitwiseAND_2x.png)
38+
![Art/bitwiseAND_2x.png](https://docs.swift.org/swift-book/images/bitwiseAND@2x.png)
3939

4040
在下面的示例当中,`firstSixBits``lastSixBits` 中间 4 个位的值都为 `1`。使用按位与运算符之后,得到二进制数值 `00111100`,等价于无符号十进制数的 `60`
4141

@@ -49,7 +49,7 @@ let middleFourBits = firstSixBits & lastSixBits // 等于 00111100
4949

5050
*按位或运算符(`|`*可以对两个数的比特位进行比较。它返回一个新的数,只要两个数的对应位中有*任意一个*`1` 时,新数的对应位就为 `1`
5151

52-
![Art/bitwiseOR_2x.png](https://docs.swift.org/swift-book/_images/bitwiseOR_2x.png)
52+
![Art/bitwiseOR_2x.png](https://docs.swift.org/swift-book/images/bitwiseOR@2x.png)
5353

5454
在下面的示例中,`someBits``moreBits` 存在不同的位被设置为 `1`。使用按位或运算符之后,得到二进制数值 `11111110`,等价于无符号十进制数的 `254`
5555

@@ -63,7 +63,7 @@ let combinedbits = someBits | moreBits // 等于 11111110
6363

6464
*按位异或运算符*,或称“排外的或运算符”(`^`),可以对两个数的比特位进行比较。它返回一个新的数,当两个数的对应位不相同时,新数的对应位就为 `1`,并且对应位相同时则为 `0`
6565

66-
![Art/bitwiseXOR_2x.png](https://docs.swift.org/swift-book/_images/bitwiseXOR_2x.png)
66+
![Art/bitwiseXOR_2x.png](https://docs.swift.org/swift-book/images/bitwiseXOR@2x.png)
6767

6868
在下面的示例当中,`firstBits``otherBits` 都有一个自己为 `1`,而对方为 `0` 的位。按位异或运算符将新数的这两个位都设置为 `1`。在其余的位上 `firstBits``otherBits` 是相同的,所以设置为 `0`
6969

@@ -75,7 +75,7 @@ let outputBits = firstBits ^ otherBits // 等于 00010001
7575

7676
### Bitwise Left and Right Shift Operators(按位左移、右移运算符) {#bitwise-left-and-right-shift-operators}
7777

78-
*按位左移运算符(`<<`**按位右移运算符(`>>`*可以对一个数的所有位进行指定位数的左移和右移,但是需要遵守下面定义的规则。
78+
*按位左移运算符(`<<`**按位右移运算符(`>>`* 可以对一个数的所有位进行指定位数的左移和右移,但是需要遵守下面定义的规则。
7979

8080
对一个数进行按位左移或按位右移,相当于对这个数进行乘以 2 或除以 2 的运算。将一个整数左移一位,等价于将这个数乘以 2,同样地,将一个整数右移一位,等价于将这个数除以 2。
8181

@@ -91,7 +91,7 @@ let outputBits = firstBits ^ otherBits // 等于 00010001
9191

9292
以下这张图展示了 `11111111 << 1`(即把 `11111111` 向左移动 `1` 位),和 `11111111 >> 1`(即把 `11111111` 向右移动 `1` 位)的结果。蓝色的数字是被移位的,灰色的数字是被抛弃的,橙色的 `0` 则是被填充进来的:
9393

94-
![Art/bitshiftUnsigned_2x.png](https://docs.swift.org/swift-book/_images/bitshiftUnsigned_2x.png)
94+
![Art/bitshiftUnsigned_2x.png](https://docs.swift.org/swift-book/images/bitshiftUnsigned@2x.png)
9595

9696
下面的代码演示了 Swift 中的移位运算:
9797

@@ -131,29 +131,29 @@ let blueComponent = pink & 0x0000FF // blueComponent 是 0x99,即 153
131131

132132
其余的比特位(通常被称为*数值位*)存储了实际的值。有符号正整数和无符号数的存储方式是一样的,都是从 `0` 开始算起。这是值为 `4``Int8` 型整数的二进制位表现形式:
133133

134-
![Art/bitshiftSignedFour_2x.png](https://docs.swift.org/swift-book/_images/bitshiftSignedFour_2x.png)
134+
![Art/bitshiftSignedFour_2x.png](https://docs.swift.org/swift-book/images/bitshiftSignedFour@2x.png)
135135

136136
符号位为 `0`(代表这是一个“正数”),另外 7 位则代表了十进制数值 `4` 的二进制表示。
137137

138138
负数的存储方式略有不同。它存储 `2``n` 次方减去其实际值的绝对值,这里的 `n` 是数值位的位数。一个 8 比特位的数有 7 个比特位是数值位,所以是 `2``7` 次方,即 `128`
139139

140140
这是值为 `-4``Int8` 型整数的二进制表现形式:
141141

142-
![Art/bitshiftSignedMinusFour_2x.png](https://docs.swift.org/swift-book/_images/bitshiftSignedMinusFour_2x.png)
142+
![Art/bitshiftSignedMinusFour_2x.png](https://docs.swift.org/swift-book/images/bitshiftSignedMinusFour@2x.png)
143143

144144
这次的符号位为 `1`,说明这是一个负数,另外 7 个位则代表了数值 `124`(即 `128 - 4`)的二进制表示:
145145

146-
![Art/bitshiftSignedMinusFourValue_2x.png](https://docs.swift.org/swift-book/_images/bitshiftSignedMinusFourValue_2x.png)
146+
![Art/bitshiftSignedMinusFourValue_2x.png](https://docs.swift.org/swift-book/images/bitshiftSignedMinusFourValue@2x.png)
147147

148148
负数的表示通常被称为*二进制补码*。用这种方法来表示负数乍看起来有点奇怪,但它有几个优点。
149149

150150
首先,如果想对 `-1``-4` 进行加法运算,我们只需要对这两个数的全部 8 个比特位执行标准的二进制相加(包括符号位),并且将计算结果中超出 8 位的数值丢弃:
151151

152-
![Art/bitshiftSignedAddition_2x.png](https://docs.swift.org/swift-book/_images/bitshiftSignedAddition_2x.png)
152+
![Art/bitshiftSignedAddition_2x.png](https://docs.swift.org/swift-book/images/bitshiftSignedAddition@2x.png)
153153

154-
其次,使用二进制补码可以使负数的按位左移和右移运算得到跟正数同样的效果,即每向左移一位就将自身的数值乘以 2,每向右一位就将自身的数值除以 2。要达到此目的,对有符号整数的右移有一个额外的规则:当对有符号整数进行按位右移运算时,遵循与无符号整数相同的规则,但是对于移位产生的空白位使用*符号位*进行填充,而不是用 `0`
154+
其次,使用二进制补码可以使负数的按位左移和右移运算得到跟正数同样的效果,即每向左移一位就将自身的数值乘以 2,每向右移一位就将自身的数值除以 2。要达到此目的,对有符号整数的右移有一个额外的规则:当对有符号整数进行按位右移运算时,遵循与无符号整数相同的规则,但是对于移位产生的空白位使用*符号位*进行填充,而不是用 `0`
155155

156-
![Art/bitshiftSigned_2x.png](https://docs.swift.org/swift-book/_images/bitshiftSigned_2x.png)
156+
![Art/bitshiftSigned_2x.png](https://docs.swift.org/swift-book/images/bitshiftSigned@2x.png)
157157

158158
这个行为可以确保有符号整数的符号位不会因为右移运算而改变,这通常被称为*算术移位*
159159

@@ -195,7 +195,7 @@ unsignedOverflow = unsignedOverflow &+ 1
195195

196196
`unsignedOverflow` 被初始化为 `UInt8` 所能容纳的最大整数(`255`,以二进制表示即 `11111111`)。然后使用溢出加法运算符(`&+`)对其进行加 `1` 运算。这使得它的二进制表示正好超出 `UInt8` 所能容纳的位数,也就导致了数值的溢出,如下图所示。数值溢出后,仍然留在 `UInt8` 边界内的值是 `00000000`,也就是十进制数值的 `0`
197197

198-
![Art/overflowAddition_2x.png](https://docs.swift.org/swift-book/_images/overflowAddition_2x.png)
198+
![Art/overflowAddition_2x.png](https://docs.swift.org/swift-book/images/overflowAddition@2x.png)
199199

200200
当允许对一个无符号整数进行下溢运算时也会产生类似的情况。这里有一个使用溢出减法运算符(`&-`)的例子:
201201

@@ -208,7 +208,7 @@ unsignedOverflow = unsignedOverflow &- 1
208208

209209
`UInt8` 型整数能容纳的最小值是 `0`,以二进制表示即 `00000000`。当使用溢出减法运算符对其进行减 `1` 运算时,数值会产生下溢并被截断为 `11111111`, 也就是十进制数值的 `255`
210210

211-
![Art/overflowUnsignedSubtraction_2x.png](https://docs.swift.org/swift-book/_images/overflowUnsignedSubtraction_2x.png)
211+
![Art/overflowUnsignedSubtraction_2x.png](https://docs.swift.org/swift-book/images/overflowUnsignedSubtraction@2x.png)
212212

213213
溢出也会发生在有符号整型上。针对有符号整型的所有溢出加法或者减法运算都是按位运算的方式执行的,符号位也需要参与计算,正如 [按位左移、右移运算符](#bitwise-left-and-right-shift-operators) 所描述的。
214214

@@ -221,7 +221,7 @@ signedOverflow = signedOverflow &- 1
221221

222222
`Int8` 型整数能容纳的最小值是 `-128`,以二进制表示即 `10000000`。当使用溢出减法运算符对其进行减 `1` 运算时,符号位被翻转,得到二进制数值 `01111111`,也就是十进制数值的 `127`,这个值也是 `Int8` 型整数所能容纳的最大值。
223223

224-
![Art/overflowSignedSubtraction_2x.png](https://docs.swift.org/swift-book/_images/overflowSignedSubtraction_2x.png)
224+
![Art/overflowSignedSubtraction_2x.png](https://docs.swift.org/swift-book/images/overflowSignedSubtraction@2x.png)
225225

226226
对于无符号与有符号整型数值来说,当出现上溢时,它们会从数值所能容纳的最大数变成最小数。同样地,当发生下溢时,它们会从所能容纳的最小数变成最大数。
227227

@@ -307,7 +307,7 @@ let combinedVector = vector + anotherVector
307307

308308
这个例子实现两个向量 `(3.0,1.0)``(2.0,4.0)` 的相加,并得到新的向量 `(5.0,5.0)`。这个过程如下图示:
309309

310-
![Art/vectorAddition_2x.png](https://docs.swift.org/swift-book/_images/vectorAddition_2x.png)
310+
![Art/vectorAddition_2x.png](https://docs.swift.org/swift-book/images/vectorAddition@2x.png)
311311

312312
### 前缀和后缀运算符 {#prefix-and-postfix-operators}
313313

0 commit comments

Comments
 (0)