欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

有符号二进制乘法及MATLAB有符号数16进制到2进制的转换问题

程序员文章站 2022-06-03 12:05:41
...

有符号数乘法

在服务器中搭建乘法器验证波形时,多比特二进制数手算比较麻烦,所以导入matlab计算正确的输出结果。

此时要注意乘法器的特性,举个例子吧
5 × 5 = 25
也就是4‘b0101(+5) * 4’b0101(+5) = 0011001(+25)

那 -5 × 5 = -25该怎么做呢,应该把符号位单独拿出来异或,然后余数进行乘操作,也就是:4‘b1101(-5) * 4’b0101(5) = 1011001(-25)

然而,在电脑的二进制中,可以看到-5是1011,是用补码形式表述的,因此要对它进行补码的格式转换,才能进行乘法运算。
有符号二进制乘法及MATLAB有符号数16进制到2进制的转换问题

MATLAB有符号16进制转2进制

先把16进制数读入excel里

weight_hex = textread('E:\matlab\weight.txt','%s'); //以字符串形式读入

读完的数据是cell类型的16进制
有符号二进制乘法及MATLAB有符号数16进制到2进制的转换问题
由于matlab中没有直接的16进制转2进制的函数,需要先通过hex2dec函数转成10进制。

weight_dec = hex2dec(weight_hex);

此时为double类型的10进制
有符号二进制乘法及MATLAB有符号数16进制到2进制的转换问题
由于上面解释过的原因,这里的负数要先进行取补码的操作,才能得到正确的二进制乘法结果。
还是举例-5,16进制的-5表述为111…1011(十进制为65531),然而实际希望的-5是1000…0101(十进制的5+32768).
以下代码对十进制的数据进行符号位判定,进行取反+1

 if (weight_dec>32767)  %%意味着符号位为1,此为负数
     weight_dec = 65536 - weight_dec + 32768;  %对负数符号位以外的数取反+1
 end

接下来,通过logical(bitget())的命令就可以得到2进制,拿第二个weight(负数)举例。
这是未经过负数取补码的结果
有符号二进制乘法及MATLAB有符号数16进制到2进制的转换问题
对test进行条件判定和取补,得到的二进制如下,确实是对原来的负数数据符号位以外的符号取反+1,验证完毕。
有符号二进制乘法及MATLAB有符号数16进制到2进制的转换问题
接下来可以放入二进制乘法器中相乘了。

相关标签: matlab 补码