- 一身冷汗
- 原本打算在iPad上写下一篇“处理器”。上一次用iPad写的这篇在打开浏览器后还保存着,我就直接删掉重写了。结果把原本的我的这篇给覆盖了……
- 幸亏我有备份……
- 不过格式还是得再MarkDown上重新调整……心好累
- 突然发现在iPad的网页上也可以写博客哎,,这样就不用背着厚重的笔记本了
- 写了两句就发现,在输入状态下文本编辑窗口只能保持在最高,,,这样就被虚拟键盘挡住了,,,体验-1
再写两句发现又好了,,,体验+1
我所认为的计算机的运算,无非就是“算数”,除了传统的加减乘除外,在二进制的表示下,还有逻辑运算与移位运算。
- 而计算机真正的魅力在于,可以算得很快,所以承受得住我们去对每一个运算所赋予的详细含义,在各种含义下的运算互相碰撞着,也就干成了各种各样的事情。
- 移位运算实际上是一种受限的乘除,即只能扩大缩小一定的倍数。
- 比如1000右移一位成0100也就缩小了2倍,再移一位成0010又缩小了2倍,相对于最初缩小了4倍。
- 那我想缩小三倍怎么办?这就是乘法和除法要做的事,其很大程度上依赖了移位运算。
定点数的运算
- 二进制的特点是,只有1和0,也就可以把“1”对应为“逻辑真”,“0”对应为“逻辑假”。
- 真真假假与或非,假假真真门电路
- 简单的认识一下的话,计算机内把每一位也就是每个bit用一个电位体现,当这个电位有电表示1,没电表示0。
- 所以说计算机为什么非要采用二进制而不用十进制或其他进制呢?
- 这是因为数据中的每一位需要用一位表示的话,一个电位要表示0到9的十种状态,就要有十个电压等级,这无疑是很复杂的。
- 而且一位表示的信息越多,其处理起来也越复杂,而二进制只有1和0,处理起来极为简单,当二进制保存的位也多,其处理的复杂在于多个位之间的联系。
门电路
- 门电路干啥的?
- 还记得1和0是用“有电”和“没电”来表示的吗,而门电路就是来根据有电和没电的状态来对1和0进行运算
- 什么是运算?
- 我说1+1=2,实际上是输入了两个值,分别是1和1,告诉说对着两个数的运算是“+”,那么我就可以得到一个输出的结果2
- 每种门电路本身就对应了一种运算形式,最简单的门电路就是与“AND”、或“OR”、非“NOT”
- 一般一个门电路有两根电线作为输入,有一根电线作为输出
- 与AND:只有输入的两根电线都有电,输出的电线才有电
- 或OR:只有输入的两根电线都没电,输出的电线才没电
- 非NOT:只有一个输入电线,输入有电则输出没电,输入没电则输出有电
- 有电、没电、电线都是我臆想的,实现的方法我猜大概是串并联开关啥的吧,,,作为理解尚可,而具体能否这样实现我不知道了,,,有时间打算研究一下数字电路
- 注意,非门中真正起作用的是那个小圈圈,表示取反,常与其他门电路结合表示各种更为复杂的电路
逻辑运算
- 逻辑非
- 也就是取反,1变0,0变1 由“非门”电路实现
- 逻辑加
- 就是“或”,1+1=1,1+0=1,0+1=1,0+0=0。 由“或门”电路实现
- 逻辑乘
- 就是“与”,1·1=1,1·0=0·1=0·0=0。 由“与门”电路实现
- 逻辑异或
- “XOR”,其规则是1 XOR 1 = 0 XOR 0 = 0 ,1 XOR 0 = 0 XOR 1 = 1
- 解释1:相同输出0,不同输出1。只适合两个数的时候。
- 解释2:参与运算的1的个数为偶数输出0,为奇数输出1。 适合多个数进行XOR运算时候,比如1 XOR 0 XOR 1 = 0。
- 异或运算有很多很好的特性,没法讲,活久见
移位运算
- 移位运算就是按位平移,有的位会移到外面,那么就丢弃,有的位会空出来 ,那么就补0,这个绝对的“补0”是对于原码而言的。
- 还是4 bit为例,二进制数“1000”
- 每位起个名字,最高位w3为1,依次w2为0,w1为0,w0为0
- 右移一位,就是让w0取w1的值,w1取w2的值,w2取w3的值,w3没地方取,就补0,变成了“0100”,视觉上就是“右移了一位”。
- 机器总是需要一个符号位来表示有符号数,而显然符号位在移位的时候并不参与,那么
- 对于有符号数的移位操作,我们叫“算数移位”
- 对于无符号数的移位操作,我们叫“逻辑移位”
其实无论算数移位还是逻辑移位,都是一种移位的规则,只不过只有对于各自的操作数才有意义。 显然符号位的移位并没有什么意义,,,,,,当然如果有什么特殊的手法可以让符号位的移动产生重要的意义,那么当然是可以移动的。
算术移位
- 基本规则:符号位不变,移位的空位补0
- 细则1:对于正数,无论机器内使用原码、反码还是补码表示,其都是原码的形式,因正数的原码反码补码是同样的表示,所以空位补0
- 细则2:对于负数,原码下空位补0,反码空位补1,补码左移补0,右移补1
- 有个表格会好理解一些,依旧是4bit,最高位符号位
数值 | 原码 | 补码 | 补码左移1位 | 左移后值 | 补码右移1位 | 右移后值 |
---|---|---|---|---|---|---|
2 | 0010 | 0010 | 0100 | 4 | 0001 | 1 |
-2 | 1010 | 1110 | 1100 | -4 | 1111 | -1 |
还有一点,就是移位的固有影响
- 本质上是乘、除的二进制简化形式,左移一位即乘2,右移一位即除2
- 而操作的数又是整数,那么在不断乘2(左移)的时候很可能会超过其上限而造成结果出错,而在不断除2(右移)的时候很可能有会因为原数为奇数而不能正确的得出其原值*0.5的值,表现就是取整,造成精度损失