原碼:就是數字的二進制表現形式。
17:10001
28: 11100
二進制轉十進制:系數*2n
n是從右往左,從0開始計數。
1 1 1 1 1 1 1 1
1 0 1 1 0 1 1 0
快速運算:每一位都是前一位的2的倍數,將遞增規律帶入二進制中,可以迅速的算出結果。
1 0 0 0 0 0 0 0 0 28
1 1 1 1 1 1 1 1 八位二進制能表示的最大數
= 1
1 1 0 1 0 1 1 1 使用減法運算
255 – 32 -8 = 215;.
正數的原碼:二進制的表現形式,最高位是0
負數的原碼:
絕對值的二進制數據,符號位變為1.
5: 0000 0101
-5: 1000 0101
在計算機中,數據都是補碼形式存在的。
正數的補碼、反碼和原碼一致。
負數的反碼:
最高位(符號位)不變,然后其他位取反(0變1,1變0)
負數的補碼:
反碼+1;
原碼最高位不變,然后其他位取反,再加1.
因為計算機中,數據都是補碼形式存在,那么當對這些數據進行位運算的時候,就應該是對他們的補碼來進行運算,而不是針對原碼運算。
例子:
-10>>2=
1000 1010->轉補碼:11110110 >>2 =11111101à轉回原碼
10000011=-3
為什么使用補碼就可以達到減法運算的目的呢?
這里提出一個模概念:取值范圍,當表示的數據超過了范圍,超過范圍的數據不要了。
簡單的說,從8到2,我們一般是用8-6=2沒問題,但是我們用加法怎么達到這個目的呢?我們可以這樣,從8開始數,8、9、10、11、12,OK,到現在已經是12了,個位是2,因為我們的局限范圍是個位,那么把十位的1扔掉,就剩下了2,這樣是不是達到目的了?
再舉個例子,時鐘從3點到1點,我們只需要逆時針撥動2個格即可,但是,我們順時針撥動10個格是不是也到達1點了?
計算機中因為電路設計的問題,無法使用減法,那么就使用補碼的加法運算,來達到原碼減法的結果。
1111 1111
+1
=1 00000000 //這個1超過了數據表示范圍,不要了,那么他的值是0
1111 1111
+10
=1 00000001
舉個例子,以8位進制數進行運算:
30-10 = 20
原碼:
0001 1110 //30
- 1000 1010 //10負數的原碼是其正數原碼最高位取反
變成補碼進行運算,發現最高位超出了,那么就舍去,因為該最高位不在本次運算數據表示范圍
0001 1110
+ 1111 0110
1 00010100
轉回原碼:00010100 –>20
新聞熱點
疑難解答