您的位置:首页 > 编程语言 > MATLAB

基于MATLAB的进制转换

2018-03-09 17:43 197 查看

1、常用进制转换方法(除k取余法)

(1)十进制与二进制之间的转换 

方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数.
下面举例: 将十进制的59转换为二进制得出结果为(111011)2 


(2) 二进制与八进制、十六进制之间的转换 

首先,我们需要了解一个数学关系,即2^3=8,2^4=16,而八进制和十六进制是用这种关系衍生而来的,即用三位二进制表示一位八进制,用四位二进制表示一位十六进制数. 接着,记住4个数字8、4、2、1(2^3=8、2^2=4、2^1=2、2^0=1).

(3)八进制与十进制的转换 

    1)八进制转换为十进制 
    方法:按权相加法,即将八进制每位上的数乘以位权,然后相加之和即是十进制数. 例:①将八进制数67.35转换为十进制 
    2)十进制转换为八进制 
    十进制转换成八进制有两种方法: 
    ①间接法:先将十进制转换成二进制,然后将二进制又转换成八进制 
    ②直接法:除8取余法

2、大数进制转换

(1)背景

以上讲解的方法只适合位数较少的时候。而今这个大数据时代,我们要处理的数据动辄上万,假如你需要将一个矩阵(元素值为0,1。矩阵第一行第一列的元素为这个大数的第一位,最后一行最后一列为大数的最后一位)的所有值转换为其他进制,此时再采用除k取余法将超出计算机的存储空间,无法得到结果。因此需要引入大数进制转换的方法。

(2)除法原理

我们先来看一下熟悉的十进制除法。
例:128÷4=32.我们是怎么运算的呢?
·    第一位 1÷4=0……1;
·    第二位(1*10+2)÷4=3;
·    第三位 8÷4=2.
至此,除法结束,求得最终结果为32.
那如果是128(10)=(??)4这个又该怎么转换呢?有同学肯定会说除4取余法啊。不好意思,我们这里需要运用这个简单的例子来引出大数进制转换的核心,因此我们不这么做。
从上一个例子中我们求得了128÷4的解为32,我们将继续这个过程,直到最终的商为0,求解才结束。
接下来我们需要计算32÷4=8.同理,
·    第一位 3÷4=0......3;
·    [/b]第二位 (3*10+2)÷4=8
同样的方法,求解 8÷4,
·    第一位 8÷4=2
接着求解2÷4
·    第一位 2÷4=0......2
至此求解结束。总结上述过程如下:第一次求解 128÷4=32 ,商为 32 ,余数为 0 ;第二次求解 32÷4=8 ,商为 8 ,余数为 0 ;第三次求解 8÷4 ,商为 2 ,余数为 0;第四次求解 2÷4 =0......2 , 商为 0 ,余数为 2 。至此求解过程结束。聪明的同学可能已经发现我们在做什么了。
总结:
        1)在将 m 进制的大数 big 转换为 n 进制的数的时候,我们需要用给定的大数去除以需要转换的进制 n(求解 big 除以 n 的时候需要特别注意 big 的进制,否则模拟除法求解过程可能会出错。) ;
        2)得到第一步求解的商和余数,如果此时商为 0  ,恭喜你转换结束;否则继续用商除以进制 n ,重复上述操作直至商为0;
        3)逆序输出得到的余数,即为所求。

综合上述分析和总结我们可以得出:128(10)=(2000)4。我们来验算下,2*4^3=2*64=128,好神奇啊,居然对了。话不多说直接上代码。

(3)MATLAB代码

function res=bin2tri(msg)
%进制转换程序

%Inputs
%%% msgLen : 需要转换的数据位数

%Outputs
%%% res : 求解的余数矩阵,也就是求解后的存放结果的矩阵

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 算法原理 %
% 数字较小的时候可以采取除k取余的方法 %
% 数字位数较大的时候需要模拟除法的原理来进行计算求解 %
% 本算法中一律采用大数求解法 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 例子 %
% (1001)2=(100)3 %
%第一次 %
%1001/3,从千位开始求解。千位:1/3=0,余数为1 %
% 百位:(1*2)/3=0,余数为2 %
% 十位:(2*2)/3=1,余数为1 %
% 个位:(1*2+1)/3=1,余数为0 %
%第二次 %
%11/3,从十位开始。 十位:1/3=0,余数为1 %
% 个位:(1*2=1)/3=1,余数为0 %
%第三次 %
%1/3,从个位开始。 个位:1/3=0,余数为1 %
%第四次 %
%0/3,结束 %
%逆序取结果,得到100(最终余数) %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% msg=[1 0 0 1];
% msg=randint(1,msgLen);
%原始进制
oldbase=2;
%新进制
newbase=3;
% 验证结果正确性
% old=0;
% new=0;
% 求oldbase进制对应的值
% for i=1:size(msg,2)
% old=old*oldbase+msg(i);
% end
%退出条件,被除数位数为0表示求解结束
%余数个数累加
j=1;
while 0~=size(msg,2)
temp=0;
i=1;
%赋值msg
n=1;
%去除ansout中的前置零
m=1;
%从最高位逐位求解,模拟除法过程
while i<=size(msg,2)
temp=temp*oldbase+msg(i);
%此处需特别注意matlab求解除法得到的不是int型,需使用fix函数
ansout(i)=fix(temp/newbase);
temp=mod(temp,newbase);
i=i+1;
end
%保存余数
res(j)=temp;
j=j+1;
while m<=size(ansout,2) && ansout(m)==0
m=m+1;
end
%消息清零,重新赋值,便于重复上述操作
msg=[];
for i=m:size(ansout,2)
msg(n)=ansout(i);
n=n+1;
end
ansout=[];
end
res=rot90(res,2);
% 求newbase对应的值
% for i=1:size(res,2)
% new=new*newbase+res(i);
% end
end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: