【无标题】

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支持负数转换时,直接使用即可。但是,知道了上述技巧,就可以更灵活的应用。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值