Skip to content

Latest commit

 

History

History
158 lines (121 loc) · 3.81 KB

File metadata and controls

158 lines (121 loc) · 3.81 KB
Error in user YAML: (<unknown>): found a tab character that violate indentation while scanning a plain scalar at line 3 column 3
---
- oeasy Python 0367
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
- 本教程同步发布在: 
	- 个人网站: `https://oeasy.org` 
	- 蓝桥云课: `https://www.lanqiao.cn/courses/3584` 
	- GitHub: `https://github.com/overmind1980/oeasy-python-tutorial` 
	- Gitee: `https://gitee.com/overmind1980/oeasypython` 
---

位运算符

回忆

  • 上次了解的是
    • bitwise 运算符
效果 英文 符号 操作数
按位与 bitwise and & 2
按位或 bitwise or | 2
按位非 bitwise not ~ 1
按位异或 bitwise exclusive or ^ 2
  • 除了 非与或之外
    • 还有什么其他的运算符吗??🤔

图片描述

查询

图片描述

  • 在位运算符紧挨着的地方
  • 有一个 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
  • 我们从逻辑运算到位运算再到移位运算
  • 走了好远
  • 最后我们总结一下条件分支流程吧?🤔
  • 下次再说 👋

  • 本文来自 oeasy Python 系统教程。
  • 想完整、扎实学 Python,
  • 搜索 oeasy 即可。