4.4 位运算符
位运算是以二进位(bit)为单位进行运算的,操作数和结果都是整型数据。位运算符有如下几个运算符:&
,|
,^
,~
,>>
,<<
,具体说明参见表4-6。
表4-6 位运算符
运算符 | 名称 | 例子 | 说明 |
---|---|---|---|
~
| 位反 |
~x
|
将x 的值按位取反
|
&
| 位与 |
x&y
|
x与y 位进行位与运算
|
|
| 位或 |
x|y
|
x 与y 位进行位或运算
|
^
| 位异或 |
x^y
|
x 与y 位进行位异或运算
|
>>
| 右移 |
x>>a
|
x 右移a 位,无符号整数高位采用0补位,有符号整数高位采用符号位补位
|
<<
| 左移 |
x<
|
x 左移a 位,低位位补0
|
为了进一步理解它们,我们看看下面的例子:
let a: UInt8 = 0b10110010 ①
let b: UInt8 = 0b01011110 ②
println("a | b = \(a | b)") //11111110 ③
println("a & b = \(a & b)") //00010010 ④
println("a ^ b = \(a ^ b)") //11101100 ⑤
println("a = \(a)") //01001101 ⑥
println("a >> 2 = \(a >> 2)") //00101100 ⑦
println("a << 2 = \(a << 2)") //11001000 ⑧
let c:Int8 = -0b1100 ⑨
println("c >> 2 = \(c >> 2)") //-00000011 ⑩
println("c << 2 = \(c << 2)") //-00110000 ⑪
输出结果如下:
a | b = 254
a & b = 18
a ^ b = 236
~a = 77
a >> 2 = 44
a << 2 = 200
c >> 2 = -3
c << 2 = -48
上述代码中,我们在第①行和第②行分别定义了UInt8
(无符号8
位整数)变量a
和b
,0b01011110表示二进制整数,前面的0b前缀表示二进制。在第⑨行定义了c
为Int8
(有符号8位整数),它右位移的时候,高位使用符号位占位的。注意输出结果是十进制的。
代码第③行println("a | b = (a | b)")
是进行位或运算,结果是二进制的11111110,它的运算过程如图4-1所示,从图中可见,a
和b
按位进行或计算,只要有一个为1,这一位就为1,否则为0。
图 4-1 位或运算
代码第④行println("a & b = (a & b)")
是进行位与运算,结果是二进制的00010010,它的运算过程如图4-2所示,从图中可见,a
和b
按位进行与计算,只有两位全部为1,这一位才为1,否则为0。
图 4-2 位与运算
代码第⑤行println("a ^ b = (a ^ b)")
是进行位异或运算,结果是二进制的11101100,它的运算过程如图4-3所示,从图中可见,a
和b
按位进行异或计算,只有两位相反,这一位才为1,否则为0。
图 4-3 异或位运算
代码第⑦行println("a >> 2 = (a >> 2)")
是进行右位移2位运算,结果是二进制的00101100,它的运算过程如图4-4所示,从图中可见,a
的低位被移除掉,高位用0补位。
图 4-4 右位移2位运算
代码第⑧行println("a << 2 = (a << 2)")
是进行左位移2位运算,结果是二进制的11001000,它的运算过程如图4-5所示,从图中可见,a
的高位被移除掉,低位用0补位。
图 4-5 左位移2位运算
通过上面的详细解释,相信大家已经能够理解上述代码的运行结果了,其他的不再赘述。