📅  最后修改于: 2023-12-03 15:35:13.091000             🧑  作者: Mango
在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位和更高位将被忽略并清零。
右移运算符有两种形式:逻辑右移和算术右移。
下面是一个例子:
let a: UInt8 = 0b1010
let b = a >> 2 // 0b0010
let c: Int8 = -0b1010
let d = c >> 2 // -0b0011
在这个例子中,我们分别将一个UInt8类型的整数和一个Int8类型的负整数进行右移运算。输出结果分别为一个UInt8类型的整数和一个Int8类型的负整数。对于UInt8类型的整数,算术右移和逻辑右移结果是相同的;对于Int8类型的负整数,算术右移结果与逻辑右移结果不同,因为算术右移针对数值的正负性质有特殊处理。