📜  Swift按位和移位运算符(1)

📅  最后修改于: 2023-12-03 15:35:13.091000             🧑  作者: Mango

Swift按位和移位运算符

在Swift中,我们可以使用按位和移位运算符来处理二进制数据。这些运算符将整数转换为二进制表示形式,并在这些值上执行按位和移位操作。

按位运算符

按位运算符允许我们对整数的二进制表示形式中的各个位进行操作。Swift中提供了四个按位运算符:

  • 按位与(&)
  • 按位或(|)
  • 按位异或(^)
  • 按位取反(~)
按位与

按位与运算符(&)会将两个值的二进制表示形式的每个位进行比较,如果两个值对应位都为1,则结果对应位为1,否则为0。

下面是一个例子:

let a: UInt8 = 0b0101
let b: UInt8 = 0b0011
let c = a & b  // 0b0001

在这个例子中,我们将两个UInt8类型的整数进行按位与运算。输出结果是一个UInt8类型的整数,其二进制表示形式为0b0001,表示结果的第二位是1。

按位或

按位或运算符(|)会将两个值的二进制表示形式的每个位进行比较,如果两个值对应位有一者为1,则结果对应位为1,否则为0。

下面是一个例子:

let a: UInt8 = 0b0101
let b: UInt8 = 0b0011
let c = a | b  // 0b0111

在这个例子中,我们将两个UInt8类型的整数进行按位或运算。输出结果是一个UInt8类型的整数,其二进制表示形式为0b0111,表示结果的第二、三、四位是1。

按位异或

按位异或运算符(^)会将两个值的二进制表示形式的每个位进行比较,如果两个值对应位不同,则结果对应位为1,否则为0。

下面是一个例子:

let a: UInt8 = 0b0101
let b: UInt8 = 0b0011
let c = a ^ b  // 0b0110

在这个例子中,我们将两个UInt8类型的整数进行按位异或运算。输出结果是一个UInt8类型的整数,其二进制表示形式为0b0110,表示结果的第二、三位是1。

按位取反

按位取反运算符(~)会将一个值的二进制表示形式的每个位进行按位取反,即1变为0,0变为1。

下面是一个例子:

let a: UInt8 = 0b0101
let b = ~a  // 0b1010

在这个例子中,我们将一个UInt8类型的整数进行按位取反运算。输出结果是一个UInt8类型的整数,其二进制表示形式为0b1010,表示a二进制中每一位都发生了取反。

移位运算符

移位运算符包括左移运算符(<<)和右移运算符(>>),它们将一个整数的二进制表示形式移位。左移运算符将所有位向左移动指定的位数,右移运算符将所有位向右移动指定的位数。

左移运算符

左移运算符(<<)会将一个整数的二进制表示形式向左移动指定的位数。两个小于等于8位的整数进行左移运算后,结果的第9位和更高位将被忽略并清零。

下面是一个例子:

let a: UInt8 = 0b1010
let b = a << 2  // 0b1000

在这个例子中,我们将一个UInt8类型的整数向左移动两位。输出结果是一个UInt8类型的整数,其二进制表示形式为0b1000,表示a二进制中第一位被移动到了第三位,第二、三、四位被清零。

右移运算符

右移运算符(>>)会将一个整数的二进制表示形式向右移动指定的位数。两个小于等于8位的整数进行右移运算后,结果的第9位和更高位将被忽略并清零。

右移运算符有两种形式:逻辑右移和算术右移。

  • 逻辑右移运算符(>>>)会将一个无符号整数的二进制表示形式向右移动指定的位数,并用0填充最高位。所以逻辑右移不会对数值的正负性质造成影响。
  • 算术右移运算符(>>)会将一个有符号整数的二进制表示形式向右移动指定的位数,并用数值的最高位填充左侧空位。所以算术右移会对数值的正负性质造成影响。

下面是一个例子:

let a: UInt8 = 0b1010
let b = a >> 2  // 0b0010
let c: Int8 = -0b1010
let d = c >> 2  // -0b0011

在这个例子中,我们分别将一个UInt8类型的整数和一个Int8类型的负整数进行右移运算。输出结果分别为一个UInt8类型的整数和一个Int8类型的负整数。对于UInt8类型的整数,算术右移和逻辑右移结果是相同的;对于Int8类型的负整数,算术右移结果与逻辑右移结果不同,因为算术右移针对数值的正负性质有特殊处理。