'25_Advanced_Operators'中的按位取反小节翻译完成
This commit is contained in:
@ -12,37 +12,37 @@
|
|||||||
- [运算符函数(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运算符的实现。Swift简化了运算符的自定义实现,也使判断不同类型所对应的行为更为简单。
|
||||||
|
|
||||||
可定制的运算符并不限于那些预设的运算符,你可以自定义中置,前置,后置及赋值运算符,当然还有优先级和结合性。这些运算符在代码中可以像预设的运算符一样使用,你也可以扩展已有的类型以支持你自定义的运算符。
|
我们不用被预定义的运算符所限制。在 Swift 当中可以自由地定义中缀、前缀、后缀和赋值运算符,以及相应的优先级与结合性。这些运算符在代码中可以像预设的运算符一样使用,我们甚至可以扩展已有的类型以支持自定义的运算符。
|
||||||
|
|
||||||
<a name="bitwise_operators"></a>
|
<a name="bitwise_operators"></a>
|
||||||
## 位运算符
|
## 位运算符
|
||||||
|
|
||||||
位操作符可以操作数据结构中原始数据的每个比特位。位操作符通常在诸如图像处理和创建设备驱动等底层开发中使用,位操作符在同外部资源的数据进行交互的时候也很有用,比如在使用用户协议进行通信的时候,运用位运算符来对原始数据进行编码和解码。
|
位运算符(`Bitwise operators`)可以操作一个数据结构中每个独立的比特位。它们通常被用在底层开发中,比如图形编程和创建设备驱动。位运算符在处理外部资源的原始数据时也十分有用,比如对自定义通信协议传输的数据进行编码和解码。
|
||||||
|
|
||||||
Swift支持如下所有C语言的位运算符:
|
Swift 支持C语言中的全部位运算符,具体如下:
|
||||||
|
|
||||||
### 按位取反运算符
|
### 按位取反运算符(`bitwise NOT operator`)
|
||||||
|
|
||||||
按位取反运算符`~`对一个操作数的每一位都取反。
|
按位取反运算符(`~`) 可以对一个数值的全部比特位进行取反:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
这个运算符是前置的,所以请不加任何空格地写在操作数之前。
|
按位取反操作符是一个前置运算符,需要直接放在操作数的之前,并且它们之间不能添加任何空格。
|
||||||
|
|
||||||
```swift
|
```
|
||||||
let initialBits: UInt8 = 0b00001111
|
let initialBits: UInt8 = 0b00001111
|
||||||
let invertedBits = ~initialBits // 等于 0b11110000
|
let invertedBits = ~initialBits // 等于 0b11110000
|
||||||
```
|
```
|
||||||
|
|
||||||
`UInt8`是8位无符整型,可以存储0~255之间的任意数。这个例子初始化一个整型为二进制值`00001111`(前4位为`0`,后4位为`1`),它的十进制值为`15`。
|
`UInt8` 类型的整数有 8 个比特位,可以存储 0 ~ 255之间的任意整数。这个例子初始化了一个 `UInt8` 类型的整数,其二进制值为 `00001111`,它的前 4 位都为`0`,后 4 位都为`1`。这个值等价于十进制的 `15` 。
|
||||||
|
|
||||||
使用按位取反运算`~`对`initialBits`操作,然后赋值给`invertedBits`这个新常量。这个新常量的值等于所有位都取反的`initialBits`,即`1`变成`0`,`0`变成`1`,变成了`11110000`,十进制值为`240`。
|
接着使用按位取反运算符创建了一个名为 `invertedBits` 的常量,这个常量的值与全部比特位取反后的 `initialBits` 相等。即所有的 `0` 都变成了 `1`,同时所有的 `1` 都变成 `0`。`invertedBits` 的二进制值为 `11110000`,等价于无符号十进制数的 `240`。
|
||||||
|
|
||||||
### 按位与运算符
|
### 按位与运算符
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user