分类:
2009-12-05 17:19:21
这次,我本来还是不想编这样的程序的,可是数据太多了,用计算器一个个算实在是来不了了,无奈,我今天花了个把小时的时间编了这个将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小时在线。