那些曾虐我千百遍的計算機組成原理
本筆記知識點來源於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