位运算符

作者: 码农UP2U | 来源:发表于2020-01-07 06:11 被阅读0次

    位取反运算符

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

    位与运算符

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

    位或运算符

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

    位异或运算符

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

    位左移和右移运算符

    • 位左移运算符 << 和位右移运算符 >> 可以把所有位数的数字向左或向右移动一个确定的位数
    • 位左移和右移具有给整数乘以或除以二的效果,将一个数左移一位相当于把这个数翻倍,将一个数右移一位相当于把这个数减半

    无符号整数的移位操作

    • 已经存在的比特位按指定的位数进行左移和右移
    • 任何异动超出整型存储边界的位都会被丢弃
    • 用 0 来填充向左或向右移动后产生的空白位

    有符号整数的移位操作

    • 有符号整数使用它的第一位来表示这个整数时正数还是负数。符号位为 0 表示为正数,1 表示负数
    • 其余的位数存储了实际的值。有符号正整数和无符号数的存储方式时一样的,都是从 0 开始算起
    • 但是负数的存储方式略有不同。它存储的是 2 的 n 次方减去它的绝对值,这里的 n 为数值位的位数

    补码表示的优点

    • 首先,如果想给 -4 加个 -1,只需要将两个数的全部八个比特位相加(包括符号位),并且将计算结果中超出的部分丢弃
    • 其次,使用二进制补码可以使负数的位左移和右移操作得到跟正数同样的效果,即每向左移一位就将自身的数值乘以 2,每向右移一位就将自身的数值除以 2。要达到此目的,对有符号整数的右移一个额外的规则:当对整数进行位右移操作时,遵循与无符号整数相同的规则,但是对于移位产生的空白位使用符号位进行填充,而不是 0。

    代码示例

    位运算是很强大的,在其他语言中也有位运算的功能,比如 C 语言、Java 语言等,在汇编语言中更是离不开位运算。

    let number: UInt8 = 255
    // 取反,输出 0
    print(~number)
    // 按位与 输出 0
    print(number & 0)
    // 按位与 输出 1
    print(number & 1)
    // 按位或 输出 255
    print(number | 0)
    // 按位异或 输出 252
    print(number ^ 3)
    
    let number1: UInt8 = 8
    // 左移操作 输出 16
    print(number1 << 1)
    // 右移操作 输出 4
    print(number1 >> 1)
    
    let number2: Int8 = -8
    // 有符号数的左移 输出 -16
    print(number2 << 1)
    // 有符号数的右移 输出 -4
    print(number2 >> 1)
    


    我的微信公众号:“码农UP2U”

    相关文章

      网友评论

        本文标题:位运算符

        本文链接:https://www.haomeiwen.com/subject/pgnlactx.html