那些曾虐我千百遍的计算机组成原理
程序员文章站
2022-06-07 08:48:31
...
那些曾虐我千百遍的计算机组成原理
本笔记知识点来源于b站狂神说:聊汇编先导课,有兴趣的小伙伴点这里:狂神聊汇编先导课
文章目录
进制的本质
进制的本质是什么?进制就是一组符号和逢几进几的概念。
什么意思呢?来看一组数据
0 1 2 3 4 5 6 7 8 9 10
#可以看到,0~10就是我们定义的符号,而9下一个数字是10就是逢10进1 -》10
因此我现在也可以来定义自己的进制,老王的进制
符号为 a b c d e 代表1 2 3 4 5 ,然后逢5进1
结果为
0 1 2 3 4 5
a b c d e ba
因此说进制的本质就是一组符号+逢几进几的概念
此种思想运用于进制加密范畴,毕竟你定义的进制符号和进制算法,别人是不知道的,解密就毕竟困难,但是如果数据量一大,任何数都可以找出规律。
有符号数和无符号数的区别
有符号数和无符号数都是用8位 二进制数来表示
即:0000 0000
但是如何表示负数呢?由此就出现了有符号数和无符号数
在无符号数中,8位表示的值就是其本身的值,例如:0000 1001 表示9
而在有符号数中,最高位的第一位表示正数(0),负数(1)
例如
0000 1001 -》9
1000 1001-》-9
令人头疼的原码、反码、补码
这些编码规则全都是针对有符号数数的
原码:
- 正数:除了第一位为符号位,对其他位本身取绝对值
- 负数:跟正数一样
反码:
- 正数:跟原码一样
- 负数:第一位为符号位,其余位对原码进行取反
补码:
- 正数:跟原码一样
- 负数:第一位为符号位,其余位对原码取反+1
例子:
1
原码 0000 0001
反码 0000 0001
补码 0000 0001
-1
原码 1000 0001
反码 1111 1110 除符号位取反
补码 1111 1111 原码取反+1
-7
原码 1000 0111
反码 1000 1000 除符号位取反
补码 1111 1001 原码取反+1
位运算
计算机任何操作都是通过位运算来完成的
与(&)
串联,都为1时才亮
只有当两个开关都处于关闭(1)时,灯泡才亮(1)
即只有都为1时,结果才为1
#与(&)运算
1001 0011
1110 1010
-----------
1000 0010
或(|)
并联,有1就亮
当两个开关任意一个关闭(1)时,灯泡即亮
即任意有为1,则结果位1
#或(|)运算
1001 0011
1110 1010
-----------
1111 1011
异或(^)
双刀开关,需要不同才亮
只有当开关状态不同时,灯泡才亮
即只有不同时,才为1
#异或(^)运算
1001 0011
1110 1010
-----------
0111 1001
非(~)
按位取反
#非运算(~)
1110 1010
-----------
0001 0101
移位操作
左移(<<)
#左移,低位补0
1001 0111
---------
0010 1110
左移相当于是数*2,例如101(5)左移-》1010(10)
右移(>>)
#右移,高位补符号位
1001 0111
---------
1100 1011
右移相当于是数/2
用位运算进行加减乘除
首先要理解,所有的加减乘除都是加法
例如:
6-4 =》 6+(-4)
6*3 =》 6+6+6
18/3 =》3+多少次会=18
计算机底层加法:
4+5=?
0000 0100
0000 0101
---------
#加法运算只有两步,异或,与运算,且这两步无限循环,直到与运算结果都为0
#第一步:做异或运算(不同则1)
0000 0100
0000 0101
---------
0000 0001 (异或结果)
#第二部,与运算(都为1则1),用来判断是否进位,如果都为0,则取上一次异或结果
0000 0100
0000 0101
---------
0000 0100
#如果此时发现与运算结果不等于0,则进行第三步:与运算结果左移
0000 0100
---------
0000 1000 (左移结果)
=======================================
继续做循环,用异或结果和左移结果
0000 0001
0000 1000
---------
#第一步,异或
0000 0001
0000 1000
---------
0000 1001
#第二部,与运算判断是否进位
0000 0001
0000 1000
---------
0000 0000
#此时发现与运算结果为0,则取上一次异或结果:0000 1001 =》9
例子:8-2 =》 8+(-2)=?
-2:0000 0010
补码表示(按位取反+1):1111 1110
0000 1000
1111 1110
---------
#异或
0000 1000
1111 1110
---------
1111 0110
#与运算,判断进位
0000 1000
1111 1110
---------
0000 1000
#需要进位,左移一位
0000 1000
---------
0001 0000
=====================================
循环
1111 0110
0001 0000
---------
#异或
1111 0110
0001 0000
---------
1110 0110
#与运算判断进位
1111 0110
0001 0000
---------
0001 0000
#左移
0001 0000
---------
0010 0000
==========================================
循环
1110 0110
0010 0000
---------
#异或
1110 0110
0010 0000
---------
1100 0110
#与运算
1110 0110
0010 0000
---------
0010 0000
#左移进位
0010 0000
---------
0100 0000
=======================================
循环
1100 0110
0100 0000
---------
#异或
1100 0110
0100 0000
---------
1000 0110
#与运算
1100 0110
0100 0000
---------
0100 0000
#左移进位
0100 0000
---------
1000 0000
================================
循环
1000 0110
1000 0000
---------
#异或
1000 0110
1000 0000
---------
0000 0110
#与运算 判断进位
1000 0110
1000 0000
---------
1000 0000
#左移
1000 0000
---------
0000 0000
===========================
循环
0000 0110
0000 0000
---------
#异或运算
0000 0110
0000 0000
---------
0000 0110
#与运算
0000 0110
0000 0000
---------
0000 0000
与运算结果为0,则不用进位 结果为上一次异或:
0000 0110:6
上一篇: 动态从键盘输入20个二位无符号数,找出其中最大数并显示。
下一篇: STOS指令和LEA指令
推荐阅读