欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

那些曾虐我千百遍的计算机组成原理

程序员文章站 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. 正数:除了第一位为符号位,对其他位本身取绝对值
  2. 负数:跟正数一样

反码:

  1. 正数:跟原码一样
  2. 负数:第一位为符号位,其余位对原码进行取反

补码:

  1. 正数:跟原码一样
  2. 负数:第一位为符号位,其余位对原码取反+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