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

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

本笔记知识点来源于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


上一篇:行人重识别(5)——行人重识别Market1501数据集介绍


下一篇:预习原码补码