那些曾虐我千百遍的計算機組成原理

那些曾虐我千百遍的計算機組成原理

本筆記知識點來源於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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章