Swift 位运算符和位移位运算符
在本章节中,我们将通过实例学习 Swift 中的位运算符和不同类型的移位运算符。
位运算符在单个位级别对整数数据执行操作。这些操作包括测试、设置或移位实际位。例如:
a & b
a | 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 25
00001100
& 00011001
_____________
00001000 = 8 (In Decimal)
实例
var a = 12
var b = 25
var result = a & b
print (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 25
00001100
| 00011001
____________
00011101 = 29 (In decimal)
实例
var a = 12
var b = 25
var result = a | b
print(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 25
00001100
^ 00011001
____________
00010101 = 21 (In decimal)
实例
var a = 12
var b = 25
var result = a ^ b
print(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 = 11011011
2's Complement :
11011011
+ 1
________
11011100
在这里,我们可以看到 2 的补码 36(即 -36)是 11011100。这个值相当于我们在上一节中计算的 35 的位补码。
因此,我们可以说 35 的位补码等于 -36。
实例
var b = 12
var result = ~b
print(result) // -13
在上述实例中,我们对 12 执行了按位求补运算。
The bitwise complement of 12 = - (12 + 1) = -13
i.e. ~12 = -13
这正是我们在输出中得到的结果。
左移运算符
左位移运算符将所有位向左移位指定位数。它由 <<
表示。
正如我们从上图中看到的,
- 我们有一个 4 位数字。当我们对其执行 1 位左移操作时,每个位向左移动 1 位。
- 结果,最左边的位被丢弃,而最右边的位保持空白。此空缺由 0 取代。
实例
var a = 3
var result = a << 2
print(result) // 12
在上面的实例中,我们创建了一个值为 3 的变量 a
var result = a << 2
这里,我们对 a
执行 2 位左移操作。
右移运算符
右移运算符将所有位向右移动一定数量的指定位。它由>>
表示。
正如我们从上图中看到的,
- 我们有一个 4 位数字。当我们对其执行 1 位右移操作时,每个位向右移动 1 位。
- 结果,最右边的位被丢弃,而最左边的位保持空白。对于无符号数字,此空缺将替换为 0。
- 对于有符号数字,符号位(0 表示正数,1 表示负数)用于填充空出的位位置。
实例
var a = 4
var result = a >> 2
print(result) // 1
a = -4
result = a >> 2
print(result) // -1
在上面的实例中,我们对值 4 和 -4 执行 2 位右移操作。
如您所见,4 和 -4 的结果不同。这是因为 4 是一个无符号整数,因此空缺用 0 填充,而 -4 是负符号数字,因此空缺由 1 填充。