Swift 位运算符和位移位运算符

在本章节中,我们将通过实例学习 Swift 中的位运算符和不同类型的移位运算符。

位运算符在单个位级别对整数数据执行操作。这些操作包括测试、设置或移位实际位。例如:

  1. a & b
  2. a | b

在本例中,&| 是位运算符。

以下是 Swift 中包含的各种位运算符列表:

运算符名称实例
&按位与a & b
|按位或a | b
^按位异或a ^ b
~按位求补~ a
<<按位左移a << b
>>按位右移a >> b

按位与运算符(Bitwise AND)

当且仅当两个操作数均为 1 时,按位与运算符返回 1。否则,它返回 0

ab 上的按位与运算可表示在下表中:

aba & b
000
010
100
111
注意:上表被称为按位与运算符的 "真值表"。

让我们看看两个整数 1225 的按位与运算:

  1. 12 = 00001100 (In Binary)
  2. 25 = 00011001 (In Binary)
  3. // Bitwise AND Operation of 12 and 25
  4. 00001100
  5. & 00011001
  6. _____________
  7. 00001000 = 8 (In Decimal)
实例
  1. var a = 12
  2. var b = 25
  3. var result = a & b
  4. print (result) // 8

结果如下:

  1. var result = a & b

这里,我们在 ab 之间执行位与运算。


按位或运算符(Bitwise OR)

如果至少有一个操作数为 1,则按位或运算符 | 返回 1。否则,它返回 0

ab 上的按位或运算可表示在下表中:

aaa | b
000
011
111
101

让我们看看两个整数 1225 的按位或运算:

  1. 12 = 00001100 (In Binary)
  2. 25 = 00011001 (In Binary)
  3. Bitwise OR Operation of 12 and 25
  4. 00001100
  5. | 00011001
  6. ____________
  7. 00011101 = 29 (In decimal)
实例
  1. var a = 12
  2. var b = 25
  3. var result = a | b
  4. print(result) // 29

这里,我们在 1225 之间执行按位或。


按位异或运算符(Bitwise XOR)

当且仅当其中一个操作数为 1 时,按位异或运算符 ^ 返回 1。但是,如果两个操作数均为 0,或如果两者均为 1,则结果为 0

ab 上的按位异或运算可在下表中表示:

aba ^ b
000
011
101
110

让我们看看两个整数 1225 的按位异或运算:

  1. 12 = 00001100 (In Binary)
  2. 25 = 00011001 (In Binary)
  3. Bitwise XOR Operation of 12 and 25
  4. 00001100
  5. ^ 00011001
  6. ____________
  7. 00010101 = 21 (In decimal)
实例
  1. var a = 12
  2. var b = 25
  3. var result = a ^ b
  4. print(result) // 21

这里,我们在 1225 之间执行按位异或。


按位求补运算符(Bitwise XOR)

按位求补运算符 ~ 将位反转(0 变为 11 变为 0)。

重要的是要注意,任何整数 N 的按位求补等于 -(N+1)。例如:

考虑一个整数 35。根据规则,35 的按位求补应该是 -(35+1)=36。现在,让我们看看我们是否得到正确答案。

  1. 35 = 00100011 (In Binary)
  2. // Using bitwise NOT operator
  3. ~ 00100011
  4. ________
  5. 11011100

在上面的例子中,00100011 的按位求补是 11011100。这里,如果我们将结果转换为十进制,我们得到 220。

然而,重要的是要注意,我们不能直接将结果转换为十进制并获得所需的输出。这是因为二进制结果 11011100 也相当于 -36。

为了理解这一点,我们首先需要计算 -36 的二进制输出。我们使用 2 的补码来计算负整数的二进制。


2 的补码

数字 N 的 2 的补码给出 -N。它是通过将位(0110)反相然后加 1 来计算的,

  1. 36 = 00100100 (In Binary)
  2. 1's Complement = 11011011
  3. 2's Complement :
  4. 11011011
  5. + 1
  6. ________
  7. 11011100

在这里,我们可以看到 2 的补码 36(即 -36)是 11011100。这个值相当于我们在上一节中计算的 35 的位补码。

因此,我们可以说 35 的位补码等于 -36

实例
  1. var b = 12
  2. var result = ~b
  3. print(result) // -13

在上述实例中,我们对 12 执行了按位求补运算。

  1. The bitwise complement of 12 = - (12 + 1) = -13
  2. i.e. ~12 = -13

这正是我们在输出中得到的结果。


左移运算符

左位移运算符将所有位向左移位指定位数。它由 << 表示。

正如我们从上图中看到的,

  • 我们有一个 4 位数字。当我们对其执行 1 位左移操作时,每个位向左移动 1 位。
  • 结果,最左边的位被丢弃,而最右边的位保持空白。此空缺由 0 取代。
实例
  1. var a = 3
  2. var result = a << 2
  3. print(result) // 12

在上面的实例中,我们创建了一个值为 3 的变量 a

  1. var result = a << 2

这里,我们对 a 执行 2 位左移操作。


右移运算符

右移运算符将所有位向右移动一定数量的指定位。它由 >> 表示。

正如我们从上图中看到的,

  • 我们有一个 4 位数字。当我们对其执行 1 位右移操作时,每个位向右移动 1 位。
  • 结果,最右边的位被丢弃,而最左边的位保持空白。对于无符号数字,此空缺将替换为 0
  • 对于有符号数字,符号位(0 表示正数,1 表示负数)用于填充空出的位位置。
注意:有符号整数表示正整数和负整数,而无符号整数仅表示正整数。
实例
  1. var a = 4
  2. var result = a >> 2
  3. print(result) // 1
  4. a = -4
  5. result = a >> 2
  6. print(result) // -1

在上面的实例中,我们对值 4-4 执行 2 位右移操作。

如您所见,4-4 的结果不同。这是因为 4 是一个无符号整数,因此空缺用 0 填充,而 -4 是负符号数字,因此空缺由 1 填充。

分类导航