Swift学习17:位运算符

张建 lol

位取反运算符

  • 位取反运算符 ~ 是对所有位的数字进行取反操作

1
2
3
let n1:UInt8 = 255
let n2 = ~n1
print(n2)

位与运算符

  • 位与运算符 & 可以对两个数的比特位进行合并,它会返回一个新的数,只有当这两个数都是 1 时才能返回 1

1
2
3
4
5
6
let n1:UInt8 = 255
let n2 = ~n1
let n3 = n1 & n2
let n4 = n1 | n2
print(n3)
print(n4)

位或运算符

  • 位或运算符 | 可以对两个比特位进行比较,然后返回一个新的数,只要两个操作位任意一个为 1 时,那么对应的位数就为 1

位异或运算符

  • 位异或运算符,或者说 互斥或 ^ 可以对两个数的比特位进行比较,它返回一个新的数,当两个操作数的对应位不同时,该数的对应位就为 1

1
2
3
4
let n1:UInt8 = 255
let n2 = ~n1
let n5 = n1 ^ n2
print(n5)

位左移和右移运算符

  • 位左移运算符 << 和位右移运算符 >> 可以把所有位数的数字向左或向右移动一个确定的位数

  • 左移和右移 具有给 整数乘以或除以二 的效果,将一个数 左移 一位相当于把这个 数翻倍,将一个数 右移 相当于把这个数 减半

无符号整数的位移操作

  • 已经存在的比特位按指定的位数进行左移和右移

  • 任何移动超出整型存储边界的位都会被丢弃

  • 0 来填充向左或向右移动后产生的空白位

有符号整数的位移操作

  • 有符号整数使用它的第一位(所谓的符号位)来表示这个整数是正数还是负数,符号位 0 表示 正数1 表示 负数

  • 其余的位数(所谓的数值位)存储了实际的值,有符号正整数和无符号数的存储方式是一样的,都是从 0 开始算起

  • 但是负数的存储方式略有不同,它存储的是 2n 次方减去它的绝对值,这里的 n 为数值位的位数

示例:

1
2
3
let n6: Int = 8
print(n6 << 1)
print(n6 >> 1)

补码表示的优点

  • 首先,如果想给 -4 加个 -1,只需要将这两个数的全部 8 个比特位相加(包括符号位),并且将计算结果中超出的部分丢掉

  • 其次,使用二进制补码可以使负数位的位左移和右移操作得到根正数同样的效果,即每向左移一位就将自身的数值 乘以2 ,每向右移一位就将自身的数值 除以2,要达到此目的,对 有符号的整数 的右移有一个额外的规则:当对整数进行位右移操作时,遵循与无符号整数相同的规则,但是对于位移产生的空白位使用符号进行填充,而不是 0

  • Post title:Swift学习17:位运算符
  • Post author:张建
  • Create time:2023-02-23 01:32:26
  • Post link:https://redefine.ohevan.com/2023/02/23/Swift课程/Swift学习17:位运算符/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.