matlab基础之有符号数转二进制(补码形式)
matlab是广泛使用的工具,特别是在fpga或者ic设计领域,matlab也得到了广泛的应用。
而对于一些fpga或者ic工程师,特别是逻辑工程师,又很少使用matlab。当往往涉及一些算法设计的应用中,matlab又是非常有用的工具。
在做算法建模时,大部分使用的是有符号的整形数值,如果转换到verilog或者vhdl代码,则需要进行类型转换。虽然matlab有dec2bin函数,但是其只能进行正数的十进制转二进制。
虽然R2020a已经支持dec2bin将负数转为二进制,但是,本文还是假定dec2bin不能将负数转为二进制数。希望能开拓一些思路。
一. dec2bin函数说明
- 语法1
binStr = dec2bin(D)
D :输入的数组,当然也可以是一个数
- 举例1:D是浮点数或者整数
如果D是浮点数,则转换前会将其阶段,例如D为11或者11.3,进行转换时,输出都是1011 - 举例2:D是字符
如果D是字符数组或逻辑数组,则dec2bin会将D视为整数,其值就是Unicode的值 - 语法2
binstr=dec2bin(D,minDigits)
minDigits:输出中的最小二进制位数
不论使用的是大端还是小端模式,输出值都是相同的。
- 举例:指定位宽
D = 40;
binStr = dec2bin(D,8);
binStr =
'00101000'
如果指定的位宽小于实际的二进数表示的位宽,则仍会返回所需的二进制数值:
D = 40;
binStr = dec2bin(D,2);
binStr =
'101000'
- 举例:数组转换
输出的就是一个字符串数组,例如:
D = [10 238 67];
binStr = dec2bin(D);
binStr = 3x8 char array
'00001010'
'11101110'
'01000011'
如果是数组,以最长的位数来对齐。
二. 有符号的dec2bin
虽然R2020a开始,dec2bin函数支持使用补码形式来转换负数,但是,此处还是假定支持此功能下,如何使用dec2bin来完成负数到二进制数值的转换,以开拓思路
当D为负数时,因为当前dec2bin不支持负数,所以想到先转换正数的D,然后对其二进制数值进行取反+1,得到补码。但是通过前面的描述,知道dec2bin的返回值是字符串,是不能直接这种运算的。
通过网上信息,比如某百科,会得到如下表的表示:
举例
从上表不难发现一个规律,
-2的补码就是8+(-2)=6
-5的补码就是16+(-5)=11
即其位宽表示为N,那么负数的补码就是(2^N+负数)的二进制表示。
2^N+负数,一定是正数,所以可以使用dec2bin。
因此可以得到使用dec2bin进行转换时的代码:
if (x >= 0)
bin_x = dec2bin(x, N); % 正数的反码和补码都和原码一样
else
bin_x = dec2bin(2^N + x, N);
end
当然,当dec2bin支持负数转换时,直接使用即可。但是,知道了上述技巧,就可以更灵活的应用。