1. 程式人生 > >2---MATLAB將十進位制轉換成二進位制補碼

2---MATLAB將十進位制轉換成二進位制補碼

MATLAB中提供了一個將十進位制轉換為二進位制的函式dec2bin,但是該函式只接收非負整數,也就是不能直接將負數轉換為二進位制補碼。那如何在MATLAB中生成補碼呢?我們都知道負數的補碼為其反碼加1,然而MATLAB中的二進位制是字串,是不能直接運算的,因為要對字串進行操作,所以如果用這種方式生成補碼的話會比較困難。當然,我們也可以先用bin2dec函式將反碼轉換為十進位制加1,然後再轉換為2進位制,以降低處理複雜度,但事實上我們還有更好的辦法。

觀察一下下面的表格。

位寬N 二進位制補碼 signed unsigned 2N
3 110 -2 6 8
3 101 -3 5 8
4 1100 -4 12 16
4 1011 -5 11 16
8 1000 1000 -120 136 256
8 1000 0001 -127 129 256

_
從上表不難發現一個規律,abs(signed)+unsigned=2N,注意這個規律只針對負數。推導過程也很簡單,如一個位寬為3的負數的絕對值為2,2的二進位制表示為010,那求它的二進位制補碼就是對010取反加1。

x = 010
y = 101
z = y + 1 = 110
a = x + y = 111
b = a + 1 = 1000 = 2

3

可以看到取反的數y加上x是等於111的,那取反之後再加1再加上x就一定會等於1000,對於其他的負數也都一樣。

下圖是wiki百科裡的描述,如果圖看不清可以點選上面的連結。

這裡寫圖片描述

重要的就是這個公式

x=2Nx

對於位寬為N的正數x,我們要求x的補碼就是求正數x的原碼,所以我們得到在MATLAB裡求一個位寬為N的整數x的補碼錶示的程式碼如下:

if (x >= 0)
    bin_x = dec2bin(x, N);        % 正數的反碼和補碼都和原碼一樣
else
    bin_x = dec2bin(2^N + x, N);
end

如果是要對二進位制進行模擬的話,在某些情況下用HDL模擬,然後用MATLAB分析結果可能會更快。