高级操作符部分翻译文字校对

This commit is contained in:
RockyMyx
2014-06-25 20:00:08 +08:00
parent f42230f6bf
commit 76a059be71

View File

@ -12,18 +12,18 @@
- [运算符函数(Operator Functions)](#operator_functions) - [运算符函数(Operator Functions)](#operator_functions)
- [自定义运算符](#custom_operators) - [自定义运算符](#custom_operators)
除了[基本操作符](02_Basic_Operators.html)中所讲的运算符Swift还有许多复杂的高级运算符包括了C语和Objective-C中的位运算符和移位运算。 除了[基本操作符](02_Basic_Operators.html)中所讲的运算符Swift还有许多复杂的高级运算符包括了C语和Objective-C中的位运算符和移位运算。
不同于C语言中的数值计算Swift的数值计算默认是不可溢出的。溢出行为会被捕获并报告为错误。你是故意的好吧你可以使用Swift为你准备的另一套默认允许溢出的数值运算符如可溢出`&+`。所有允许溢出的运算符都是以`&`开始的。 不同于C语言中的数值计算Swift的数值计算默认是不可溢出的。溢出行为会被捕获并报告为错误。你是故意的好吧你可以使用Swift为你准备的另一套默认允许溢出的数值运算符如可溢出的加号为`&+`。所有允许溢出的运算符都是以`&`开始的。
自定义的结构类和枚举是否可以使用标准的运算符来定义操作当然可以在Swift中你可以为你创建的所有类型定制运算符的操作。 自定义的结构类和枚举是否可以使用标准的运算符来定义操作当然可以在Swift中你可以为你创建的所有类型定制运算符的操作。
可定制的运算符并不限于那些预设的运算符,自定义有个性的中置,前置,后置及赋值运算符,当然还有优先级和结合性。这些运算符的实现可以运用预设的运算符,也可以运用之前定制的运算符。 可定制的运算符并不限于那些预设的运算符,你可以自定义中置,前置,后置及赋值运算符,当然还有优先级和结合性。这些运算符在代码中可以像预设的运算符一样使用,你也可以扩展已有的类型以支持你自定义的运算符。
<a name="bitwise_operators"></a> <a name="bitwise_operators"></a>
## 位运算符 ## 位运算符
位操作符通常在诸如图像处理和创建设备驱动等底层开发中使用,使用它可以单独操作数据结构中原始数据的比特位。在使用一个自定义的协议进行通信的时候,运用位运算符来对原始数据进行编码和解码也是非常有效的 位操作符可以操作数据结构中原始数据的每个比特位。位操作符通常在诸如图像处理和创建设备驱动等底层开发中使用,位操作符在同外部资源的数据进行交互的时候也很有用,比如在使用用户协议进行通信的时候,运用位运算符来对原始数据进行编码和解码。
Swift支持如下所有C语言的位运算符 Swift支持如下所有C语言的位运算符
@ -33,7 +33,7 @@ Swift支持如下所有C语言的位运算符
![Art/bitwiseNOT_2x.png](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Art/bitwiseNOT_2x.png "Art/bitwiseNOT_2x.png") ![Art/bitwiseNOT_2x.png](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Art/bitwiseNOT_2x.png "Art/bitwiseNOT_2x.png")
这个运算符是前置的,所以请不加任何空格地写操作数之前。 这个运算符是前置的,所以请不加任何空格地写操作数之前。
```swift ```swift
let initialBits: UInt8 = 0b00001111 let initialBits: UInt8 = 0b00001111
@ -124,9 +124,9 @@ let blueComponent = pink & 0x0000FF // blueComponent 是 0x99, 即 153
`0xCC6699``0xFF0000`进行按位与`&`操作就可以得到红色部分。`0xFF0000`中的`0`了遮盖了`OxCC6699`的第二和第三个字节,这样`6699`被忽略了,只留下`0xCC0000` `0xCC6699``0xFF0000`进行按位与`&`操作就可以得到红色部分。`0xFF0000`中的`0`了遮盖了`OxCC6699`的第二和第三个字节,这样`6699`被忽略了,只留下`0xCC0000`
然后按向右移动16位`>> 16`。十六进制中每两个字符是8比特位所以移动16位的结果是把`0xCC0000`变成`0x0000CC`。这和`0xCC`是相等的,是十进制的`204` 然后按向右移动16位`>> 16`。十六进制中每两个字符是8比特位所以移动16位的结果是把`0xCC0000`变成`0x0000CC`。这和`0xCC`是相等的,是十进制的`204`
同样的,绿色部分来自于`0xCC6699``0x00FF00`的按位操作得到`0x006600`。然后向右移动8,得到`0x66`,即十进制的`102` 同样的,绿色部分来自于`0xCC6699``0x00FF00`的按位操作得到`0x006600`。然后向右移动8,得到`0x66`,即十进制的`102`
最后,蓝色部分对`0xCC6699``0x0000FF`进行按位与运算,得到`0x000099`,无需向右移位了,所以结果就是`0x99`,即十进制的`153` 最后,蓝色部分对`0xCC6699``0x0000FF`进行按位与运算,得到`0x000099`,无需向右移位了,所以结果就是`0x99`,即十进制的`153`
@ -160,7 +160,7 @@ let blueComponent = pink & 0x0000FF // blueComponent 是 0x99, 即 153
第二由于使用二进制补码表示我们可以和正数一样对负数进行按位左移右移的同样也是左移1位时乘于`2`右移1位时除于`2`。要达到此目的,对有符整型的右移有一个特别的要求: 第二由于使用二进制补码表示我们可以和正数一样对负数进行按位左移右移的同样也是左移1位时乘于`2`右移1位时除于`2`。要达到此目的,对有符整型的右移有一个特别的要求:
对有符整型按位右移时,使用符号位(正数为`0`,负数为`1`)填充空白位。 对有符整型按位右移时,使用0填充空白位而是根据符号位(正数为`0`,负数为`1`)填充空白位。
![Art/bitshiftSigned_2x.png](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Art/bitshiftSigned_2x.png "Art/bitshiftSigned_2x.png") ![Art/bitshiftSigned_2x.png](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Art/bitshiftSigned_2x.png "Art/bitshiftSigned_2x.png")
@ -200,7 +200,7 @@ potentialOverflow += 1
var willOverflow = UInt8.max var willOverflow = UInt8.max
// willOverflow 等于UInt8的最大整数 255 // willOverflow 等于UInt8的最大整数 255
willOverflow = willOverflow &+ 1 willOverflow = willOverflow &+ 1
// 这时候 willOverflow 等于 0 // 此时 willOverflow 等于 0
``` ```
`willOverflow``Int8`所能承载的最大值`255`(二进制`11111111`),然后用`&+`加1。然后`UInt8`就无法表达这个新值的二进制了,也就导致了这个新值上溢出了,大家可以看下图。溢出后,新值在`UInt8`的承载范围内的那部分是`00000000`,也就是`0` `willOverflow``Int8`所能承载的最大值`255`(二进制`11111111`),然后用`&+`加1。然后`UInt8`就无法表达这个新值的二进制了,也就导致了这个新值上溢出了,大家可以看下图。溢出后,新值在`UInt8`的承载范围内的那部分是`00000000`,也就是`0`
@ -234,7 +234,7 @@ willUnderflow = willUnderflow &- 1
var signedUnderflow = Int8.min var signedUnderflow = Int8.min
// signedUnderflow 等于最小的有符整数 -128 // signedUnderflow 等于最小的有符整数 -128
signedUnderflow = signedUnderflow &- 1 signedUnderflow = signedUnderflow &- 1
// 如今 signedUnderflow 等于 127 // 此时 signedUnderflow 等于 127
``` ```
### 除零溢出 ### 除零溢出
@ -400,7 +400,7 @@ let afterIncrement = ++toIncrement
``` ```
>注意: >注意:
默认的赋值符是不可重载的。只有组合赋值符可以重载。三目条件运算符 `abc` 也是不可重载。 默认的赋值符(=)是不可重载的。只有组合赋值符可以重载。三目条件运算符 `abc` 也是不可重载。
### 比较运算符 ### 比较运算符
@ -451,7 +451,7 @@ operator prefix +++ {}
} }
``` ```
`Vector2D``+++` 的实现和 `++` 的实现很接近, 唯一不同的前者是加自己, 后者是加值为 `(1.0, 1.0)` 的向量. `Vector2D``+++` 的实现和 `++` 的实现很接近, 唯一不同的前者是加自己, 后者是加值为 `(1.0, 1.0)` 的向量.
```swift ```swift
var toBeDoubled = Vector2D(x: 1.0, y: 4.0) var toBeDoubled = Vector2D(x: 1.0, y: 4.0)