Skip to content

Latest commit

 

History

History
151 lines (115 loc) · 3.78 KB

148-205644-[专业选修]移位运算符.sy.md

File metadata and controls

151 lines (115 loc) · 3.78 KB
show version enable_checker
step
1.0
true

位运算符

回忆

  • 上次了解了and 和 or的短路规则
    • 从左到右 进行计算
    • 如果 and左边是False
      • and右边被短路
    • 如果 or左边是True
      • or右边被短路
  • 这个规则被验证了一半
    • 因为print("o")的返回值为False
    • 找不到返回值为True而且有输出的函数...

图片描述

  • 除了 非与或之外
    • 还有什么其他的运算符吗??🤔

图片描述

查询

图片描述

  • 在位运算符紧挨着的地方
  • 有一个 shifts
  • 是什么意思呢?

动手

图片描述

  • 数字 1 左移 1 位就变成了 2
  • 数字 1 左移 2 位就变成了 4
  • 数字 1 左移 3 位就变成了 8
  • 为什么呢?
    • 因为这是二进制
  • 如果十进制的话
    • 小数点向右移动 1 位
    • 相当于数字左移 1 位
    • 相当于乘以 10
  • 现在是二进制的话
    • 小数点向右移动 1 位
    • 相当于数字左移 1 位
    • 相当于乘以 2
  • 同理
    • 小数点向右移动 n 位
    • 相当于数字左移 n 位
    • 相当于乘以 2n
  • 数字左移是这么理解的
  • 反过头来呢?

右移

图片描述

  • 最后都给移没有了
  • 意思大概明白了
  • 可是负数可以移位么?

负数

图片描述

  • 不但能移位
  • 还能支持大数运算
  • 不会溢出
  • 左移相当于乘以 2
  • 右移相当于整除以 2
  • 小数可以么?

小数

图片描述

  • 小数无论单精度还是双精度
  • 都是 ieee754 的编码规则
  • 连指数带有效数字一起移动没有意义
  • 那整数的话本来可以用乘以 2、整除以 2 来做啊?
  • 移位运算符有什么意义呢?

意义

  • 明确寄存器具体位数是 0 还是 1
    • reg = 0xa1
    • 写成二进制 10100001 读起来挺麻烦
  • Reg = (1 << 7) + (1 << 5) + (1 << 0)
    • 这样就很明确
    • 7、5、0 位置 1
    • 其余的 6、4、3、2、1 位置置 0

图片描述

历史

  • 在原来还没有乘法指令的时候
  • 使用移位来进行乘法运算
  • *3 就是
    • <<1 左移 1 位
      • 相当于乘以 2
    • 再加上自身
  • *6 就是
    • <<2 左移 2 位
      • 相当于乘以 4
    • 再加上 <<1 左移 1 位
      • 相当于加上自身乘以 2
  • *9 就是
    • <<3 左移 3 位
      • 相当于乘以 8
    • 再加上自身
  • 后来有了乘法指令
  • 但是如果希望用 8 位的乘法指令计算 16 位整数的乘法
  • 也需要把数字拆开完成计算

图片描述

  • 今天 高级语言有移位运算符
    • 最终转化为 cpu的移位指令
  • 早年间是如何进行移位运算的呢?

移位运算器

  • Harvard Mark 系列的
    • 64-bit magnetic shift register

图片描述

  • 当时使用电磁铁作为基础元件

图片描述

  • 计算机被称为
    • rely-based computer
    • 继电器计算机

总结

  • 这次研究了移位运算符
    • << 左移 相当于 ✖️2
    • >> 右移 相当于 ➗️2
  • 我们从逻辑运算到位运算再到移位运算
  • 走了好远
  • 最后我们总结一下条件分支流程吧?🤔
  • 下次再说 👋