Chinaunix首页 | 论坛 | 博客
  • 博客访问: 216000
  • 博文数量: 63
  • 博客积分: 3010
  • 博客等级: 中校
  • 技术积分: 620
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-05 14:36
文章存档

2010年(8)

2009年(55)

我的朋友

分类:

2009-12-05 17:19:21

做了很多的FPGA、DSP、ARM、单片机的编程,有很多地方都用到了将已知的10进制整数例如系数什么的转换成处理器可以识别的2进制补码数据,在网上找了很久一直都没有找到,想直接用MATLAB解决,可是MATLAB又没有提供这样的函数,MATLAB中的dec2bin只能将正的整数转化成2进制,对于需要补码表示的负数就无能为力。

       这次,我本来还是不想编这样的程序的,可是数据太多了,用计算器一个个算实在是来不了了,无奈,我今天花了个把小时的时间编了这个将10进制的整数转换成2进制补码表示的数。为了需要的人们,不再去费力编写,也为了和大家交流找到更好的转换方式,特此将自己的程序贴上,和大家一起探讨。

      我深知我写的程序不是最好的,但是可以实现功能,希望对此有兴趣的访客给出宝贵意见,如果有更好的办法请大家分享,共同学习,共同进步。

     以下面的程序为例,做一些简单的说明。

     程序实现的是将有符号的10进制整数转换成2进制形式,对于负数使用的是补码表示形式。由于我现在是在做FPGA时用到的,用的是12位2进制数,所以程序时将整数转换成12位的有符号2进制数。

    我们知道,对于12位2进制数,最高位为符号位,所能表示的整数范围为:-2048~2047.所以我们在转换时首先要保证待转换的整数在这个范围内才能正确的转换。

clear all;
a=[1,2,3,4,5,-6,-7,8];%待转换的10进制数
c(8,12)=0;
for i=1:8
 if a(i)<0  %判断是否需要使用补码表示,对于正数补码就是其本身,负数才需要变换处理
  b=abs(a(i));
  d=dec2bin(b,12);
  c(i,:)=d;
  c(i,:)=c(i,:)-48;%因为MATLAB将转换后的2进制0、1看作是一个个ASCII码形式的字符,所以需要作-48处理
  %取反运算
  for j=12:-1:2
   if c(i,j)==1
    c(i,j)=0;
   else
    c(i,j)=1;
   end;
  end;
  %加1运算
        if c(i,12)==1
            c(i,12)=0;
            if c(i,11)==1
                c(i,11)=0;
                if c(i,10)==1
                    c(i,10)=0;
                    if c(i,9)==1
                        c(i,9)=0
                        if c(i,8)==1
                            c(i,8)=0;
                            if c(i,7)==1
                                c(i,7)=0;
                                if c(i,6)==1
                                    c(i,6)=0;
                                    if c(i,5)==1;
                                        c(i,5)=0;
                                        if c(i,4)==1
                                            c(i,4)=0;
                                            if c(i,3)==1
                                             c(i,3)=0;
                                             if c(i,2)==1
                                                    c(i,2)=0;
                                                else c(i,2)=1;end;
                                            else c(i,3)=1;end;
                                        else c(i,4)=1;end;
                                    else c(i,5)=1;end;
                                else c(i,6)=1;end;
                            else c(i,7)=1;end;
                        else c(i,8)=1;end;
                     else c(i,9)=1;end;
                 else c(i,10)=1;end;
            else c(i,11)=1;end;
        else c(i,12)=1;end;
  c(i,1)=1;
 else
  d=dec2bin(a(i),12);
  c(i,:)=d;
  c(i,:)=c(i,:)-48;
 end;
end;

注:我使用的是MATLAB R2009a版本。我没有在其它版本测试过,估计应该没有问题,因为这里没有使用到什么特殊函数。

     各位朋友,我写的方法有点笨,不知道哪位要是有更好的方法请留言,或者Email:

另外对程序有疑义的,或者是不能完全理解的访客同样可以Email:   我们共同讨论学习。 本人邮箱24小时在线。

阅读(3674) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~