Swift 位运算符和位移位运算符
在本章节中,我们将通过实例学习 Swift 中的位运算符和不同类型的移位运算符。
位运算符在单个位级别对整数数据执行操作。这些操作包括测试、设置或移位实际位。例如:
a & ba | b
在本例中,& 和 | 是位运算符。
以下是 Swift 中包含的各种位运算符列表:
| 运算符 | 名称 | 实例 |
|---|---|---|
| & | 按位与 | a & b |
| | | 按位或 | a | b |
| ^ | 按位异或 | a ^ b |
| ~ | 按位求补 | ~ a |
| << | 按位左移 | a << b |
| >> | 按位右移 | a >> b |
按位与运算符(Bitwise AND)
当且仅当两个操作数均为 1 时,按位与运算符返回 1。否则,它返回 0。
a 和 b 上的按位与运算可表示在下表中:
| a | b | a & b |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
让我们看看两个整数 12 和 25 的按位与运算:
12 = 00001100 (In Binary)25 = 00011001 (In Binary)// Bitwise AND Operation of 12 and 2500001100& 00011001_____________00001000 = 8 (In Decimal)
实例
var a = 12var b = 25var result = a & bprint (result) // 8
结果如下:
var result = a & b
这里,我们在 a 和 b 之间执行位与运算。
按位或运算符(Bitwise OR)
如果至少有一个操作数为 1,则按位或运算符 | 返回 1。否则,它返回 0。
a 和 b 上的按位或运算可表示在下表中:
| a | a | a | b |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 1 | 1 |
| 1 | 0 | 1 |
让我们看看两个整数 12 和 25 的按位或运算:
12 = 00001100 (In Binary)25 = 00011001 (In Binary)Bitwise OR Operation of 12 and 2500001100| 00011001____________00011101 = 29 (In decimal)
实例
var a = 12var b = 25var result = a | bprint(result) // 29
这里,我们在 12 和 25 之间执行按位或。
按位异或运算符(Bitwise XOR)
当且仅当其中一个操作数为 1 时,按位异或运算符 ^ 返回 1。但是,如果两个操作数均为 0,或如果两者均为 1,则结果为 0。
a 和 b 上的按位异或运算可在下表中表示:
| a | b | a ^ b |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
让我们看看两个整数 12 和 25 的按位异或运算:
12 = 00001100 (In Binary)25 = 00011001 (In Binary)Bitwise XOR Operation of 12 and 2500001100^ 00011001____________00010101 = 21 (In decimal)
实例
var a = 12var b = 25var result = a ^ bprint(result) // 21
这里,我们在 12 和 25 之间执行按位异或。
按位求补运算符(Bitwise XOR)
按位求补运算符 ~ 将位反转(0 变为 1,1 变为 0)。

重要的是要注意,任何整数 N 的按位求补等于 -(N+1)。例如:
考虑一个整数 35。根据规则,35 的按位求补应该是 -(35+1)=36。现在,让我们看看我们是否得到正确答案。
35 = 00100011 (In Binary)// Using bitwise NOT operator~ 00100011________11011100
在上面的例子中,00100011 的按位求补是 11011100。这里,如果我们将结果转换为十进制,我们得到 220。
然而,重要的是要注意,我们不能直接将结果转换为十进制并获得所需的输出。这是因为二进制结果 11011100 也相当于 -36。
为了理解这一点,我们首先需要计算 -36 的二进制输出。我们使用 2 的补码来计算负整数的二进制。
2 的补码
数字 N 的 2 的补码给出 -N。它是通过将位(0 到 1 和 1 到 0)反相然后加 1 来计算的,
36 = 00100100 (In Binary)1's Complement = 110110112's Complement :11011011+ 1________11011100
在这里,我们可以看到 2 的补码 36(即 -36)是 11011100。这个值相当于我们在上一节中计算的 35 的位补码。
因此,我们可以说 35 的位补码等于 -36。
实例
var b = 12var result = ~bprint(result) // -13
在上述实例中,我们对 12 执行了按位求补运算。
The bitwise complement of 12 = - (12 + 1) = -13i.e. ~12 = -13
这正是我们在输出中得到的结果。
左移运算符
左位移运算符将所有位向左移位指定位数。它由 << 表示。

正如我们从上图中看到的,
- 我们有一个 4 位数字。当我们对其执行 1 位左移操作时,每个位向左移动 1 位。
- 结果,最左边的位被丢弃,而最右边的位保持空白。此空缺由 0 取代。
实例
var a = 3var result = a << 2print(result) // 12
在上面的实例中,我们创建了一个值为 3 的变量 a
var result = a << 2
这里,我们对 a 执行 2 位左移操作。
右移运算符
右移运算符将所有位向右移动一定数量的指定位。它由>> 表示。

正如我们从上图中看到的,
- 我们有一个 4 位数字。当我们对其执行 1 位右移操作时,每个位向右移动 1 位。
- 结果,最右边的位被丢弃,而最左边的位保持空白。对于无符号数字,此空缺将替换为 0。
- 对于有符号数字,符号位(0 表示正数,1 表示负数)用于填充空出的位位置。
实例
var a = 4var result = a >> 2print(result) // 1a = -4result = a >> 2print(result) // -1
在上面的实例中,我们对值 4 和 -4 执行 2 位右移操作。
如您所见,4 和 -4 的结果不同。这是因为 4 是一个无符号整数,因此空缺用 0 填充,而 -4 是负符号数字,因此空缺由 1 填充。