彻底搞明白“取反加1”到底是个什么鬼?

写作时间:2020-08-15
在这里插入图片描述

目录:

1.问题:
2.将二进制表达的负数换成十进制怎么弄?
3.总结一下

正文:

1.问题:

比如说。要表达0~255的十进制数,在FPGA使用一个8bit[7:0]的二进制就可以。
但是,我们要表达-255~255的十进制数,在FPGA中怎么表达,我们需要使用一个9bit[8:0]的数。最高位[8]是标志位。

2.将二进制表达的负数换成十进制怎么弄?

取反加一
比如: '1 0101 0101’这是9bit的二进制。
最高位1表示是负数。
其他8bit取反为“1010 1010”
再加一为“1010 10 11”
bin2dec(“1010 10 11”)=171
那么这个数就是:-171

每个过程与10进制对应起来:
如果我们直接把‘’1 0101 0101’转为十进制是多少呢?
bin2dec(“1 0101 0101”)=341
最高位的1是符号位,十进制为2^8=256
1)去掉最高位,二进制位‘’0101010’
十进制就是341-256=85
2)取反,‘’0101 0101’取反,二进制取反为“10101010”。
‘’0101010’取反,怎么取反呢,怎么方便算呢?
使用“11111111”-“0101010”,即就是“10101010”。技巧:减法可以使得1变0,0变1。
十进制就是255-85=170
3)再加一,“10101010”再加一就是“10101011”
170+1=171
那么这个数就是-171

3.总结一下:
取反加1,以9bit为例,如果最高位是1,表示负数。
那么“二进制取反加1”对应“十进制操作”如下:
a表示bin2dec(“某一个二进制01序列”),a为十进制。
b表示,我要求的那个十进制负数
b=-(255-(a-256)+1)=a-512;

if a<=255 %正数
   b=a
else   %a>255负数
   b=a-512
end

也就是0表示正数0,255表示正数255,
256表示负数-256,257表示-255,511表示-1。
这个9bit 带符号位可以表示-256~255

a=1:511;
b=zeros(1,length(a));
for ii=1:length(a)
if a(ii)<=255 %正数
   b(ii)=a(ii);
else   %a>255负数
   b(ii)=a(ii)-512;
end
end

上面代码可完全说明。


THE END~

【MATLAB-app】系列教程00_csdn上第一套关于matlab appdesigner系列“视频课”~~

  • 12
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三青山上种萝卜

红外图像核心算法,高质量解析

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值