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 |
可以看到取反的数y加上x是等于111的,那取反之后再加1再加上x就一定会等于1000,对于其他的负数也都一样。
下图是wiki百科里的描述,如果图看不清可以点击上面的链接。

重要的就是这个公式
x∗=2N−x
对于位宽为 N 的正数
x
if (x >= 0) bin_x = dec2bin(x, N); % 正数的反码和补码都和原码一样 else bin_x = dec2bin(2^N + x, N); end
如果是要对二进制进行仿真的话,在某些情况下用HDL仿真,然后用MATLAB分析结果可能会更快。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176017.html原文链接:https://javaforall.net
