十進制轉二進制補碼
我們知道將十進制數轉換為二進制補碼的方法是:
- 判斷其是負數還是正數
- 將其轉換為二進制
- 如果是正數,那么補碼到此處就求出來了
- 如果是負數,還需要在保持符號位不變的情況下將其余位取反然后加一
還有一種方法:
假定所需轉換的數字為
\[a_{(10)} \]
下標表示這個數是十進制。如果我們希望用N位二進制表示這個數的補碼,那么該數的補碼為:
\[\text{dec2bin}(2^{N}-|a_{(10)}|) \]
上式中dec2bin表示十進制轉換為二進制,\(|\cdot|\)表示取絕對值。需要注意,N的取值一定要保證能夠表示這個數。
二進制補碼轉十進制
上面是十進制數轉二進制補碼的方式。但是我發現有時候需要將二進制補碼轉換回十進制,后來就發現了這個規律:
設有一個二進制補碼數字\(b_{(2)}\)
- 保持符號位不變,剩余位取反
- 加1
- 轉換為十進制即可
例子
- 1_111 -> 1_000 -> 1_001 -> -1
- 1_01010 -> 1_10101 -> 1_10110 -> -22
驗證一下:\(2^6-22=64-22=42=101010_{(2)}\),可以發現這是正確的。
還有一個方法就是:權重算法:
設一個2進制補碼數據B,共有N位,那么其十進制數為:
\[B_{(10)} =(-1)^{B[N-1]}*2^{N-1} + \sum_{i=0}^{N-2}2^{i}\times B[i] \]
依然利用上面的例子:
- 1_111 -> \((-1)^{1}*2^{4-1} + 1*2^{0} + 1*2^{1} + 1*2^{2} = -8 + 1 + 2 + 4 = -1\)
- 1_01010 -> \((-1)^{1}*2^{6-1} + 0*2^{0} + 1*2^{1} + 0*2^{2} + 1*2^{3} + 0*2^{4} = -32 + 0 + 2 + 0 + 8 + 0 = -22\)