4.4 位运算符

位运算是以二进位(bit)为单位进行运算的,操作数和结果都是整型数据。位运算符有如下几个运算符:&|^~>><<,具体说明参见表4-6。

表4-6 位运算符

运算符 名称 例子 说明
~ 位反 ~x x的值按位取反
& 位与 x&y x与y位进行位与运算
| 位或 x|y xy位进行位或运算
^ 位异或 x^y xy位进行位异或运算
>> 右移 x>>a x右移a位,无符号整数高位采用0补位,有符号整数高位采用符号位补位
<< 左移 x< x左移a位,低位位补0

为了进一步理解它们,我们看看下面的例子:

  1. let a: UInt8 = 0b10110010
  2. let b: UInt8 = 0b01011110
  3. println("a | b = \(a | b)") //11111110 ③
  4. println("a & b = \(a & b)") //00010010 ④
  5. println("a ^ b = \(a ^ b)") //11101100 ⑤
  6. println("a = \(a)") //01001101 ⑥
  7. println("a >> 2 = \(a >> 2)") //00101100 ⑦
  8. println("a << 2 = \(a << 2)") //11001000 ⑧
  9. let c:Int8 = -0b1100
  10. println("c >> 2 = \(c >> 2)") //-00000011 ⑩
  11. println("c << 2 = \(c << 2)") //-00110000 ⑪

输出结果如下:

  1. a | b = 254
  2. a & b = 18
  3. a ^ b = 236
  4. ~a = 77
  5. a >> 2 = 44
  6. a << 2 = 200
  7. c >> 2 = -3
  8. c << 2 = -48

上述代码中,我们在第①行和第②行分别定义了UInt8(无符号8位整数)变量ab,0b01011110表示二进制整数,前面的0b前缀表示二进制。在第⑨行定义了cInt8(有符号8位整数),它右位移的时候,高位使用符号位占位的。注意输出结果是十进制的。

代码第③行println("a | b = (a | b)")是进行位或运算,结果是二进制的11111110,它的运算过程如图4-1所示,从图中可见,ab按位进行或计算,只要有一个为1,这一位就为1,否则为0。

4.4 位运算符 - 图1

图 4-1 位或运算

代码第④行println("a & b = (a & b)")是进行位与运算,结果是二进制的00010010,它的运算过程如图4-2所示,从图中可见,ab按位进行与计算,只有两位全部为1,这一位才为1,否则为0。

4.4 位运算符 - 图2

图 4-2 位与运算

代码第⑤行println("a ^ b = (a ^ b)")是进行位异或运算,结果是二进制的11101100,它的运算过程如图4-3所示,从图中可见,ab按位进行异或计算,只有两位相反,这一位才为1,否则为0。

4.4 位运算符 - 图3

图 4-3 异或位运算

代码第⑦行println("a >> 2 = (a >> 2)")是进行右位移2位运算,结果是二进制的00101100,它的运算过程如图4-4所示,从图中可见,a的低位被移除掉,高位用0补位。

4.4 位运算符 - 图4

图 4-4 右位移2位运算

代码第⑧行println("a << 2 = (a << 2)")是进行左位移2位运算,结果是二进制的11001000,它的运算过程如图4-5所示,从图中可见,a的高位被移除掉,低位用0补位。

4.4 位运算符 - 图5

图 4-5 左位移2位运算

通过上面的详细解释,相信大家已经能够理解上述代码的运行结果了,其他的不再赘述。