2---MATLAB将十进制转换成二进制补码

MATLAB中提供了一个将十进制转换为二进制的函数dec2bin,但是该函数只接收非负整数,也就是不能直接将负数转换为二进制补码。那如何在MATLAB中生成补码呢?我们都知道负数的补码为其反码加1,然而MATLAB中的二进制是字符串,是不能直接运算的,因为要对字符串进行操作,所以如果用这种方式生成补码的话会比较困难。当然,我们也可以先用bin2dec函数将反码转换为十进制加1,然后再转换为2进制,以降低处理复杂度,但事实上我们还有更好的办法。

首先得了解补码的原理,这里有3个链接。
补码-wiki百科
补码-百度百科
计算机为什么选用二进制补码

观察一下下面的表格。

位宽N二进制补码signedunsigned 2N
3110-268
3101-358
41100-41216
41011-51116
81000 1000-120136256
81000 0001-127129256

_
从上表不难发现一个规律, 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 = 23

可以看到取反的数y加上x是等于111的,那取反之后再加1再加上x就一定会等于1000,对于其他的负数也都一样。

下图是wiki百科里的描述,如果图看不清可以点击上面的链接。

这里写图片描述

重要的就是这个公式

x=2Nx

对于位宽为 N 的正数x,我们要求 x 的补码就是求正数 x 的原码,所以我们得到在MATLAB里求一个位宽为N的整数 x <script type="math/tex" id="MathJax-Element-9">x</script>的补码表示的代码如下:

if (x >= 0)
    bin_x = dec2bin(x, N);        % 正数的反码和补码都和原码一样
else
    bin_x = dec2bin(2^N + x, N);
end

如果是要对二进制进行仿真的话,在某些情况下用HDL仿真,然后用MATLAB分析结果可能会更快。

  • 26
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值