基于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
相关文章推荐
- 基于MATLAB的高等数学 求在(x0,y0)处偏导数 数值
- 【分享】基于Gabor特征提取和人工智能神经网络的人脸检测matlab代码
- 基于MATLAB的线性代数 对矩阵进行删除
- Matlab开发教程|基于Matlab的几个扬声器开发程序
- 基于MATLAB的线性代数 对矩阵求行列式(具体数字)
- 基于Matlab的自动控制原理 泰勒展开
- 基于距离的粒子滤波跟踪系统及其matlab仿真
- 基于matlab的语言采集及处理
- C++调用CUDA(基于VS2015) matlab调用CUDA 以及matlab调用C++ 学习记录
- 基于Matlab的霍夫直线检测问题的解决
- 基于DCT的图像压缩及Matlab实现
- 基于MATLAB的中值滤波算法实现
- 基于Matlab和Wind SQL数据库的通用选股策略回测程序
- 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)
- 输出全排列问题,基于递归思想,MATLAB代码。
- 基于FPGA的图像处理(四)--Matlab Language supported by Mcode
- 贝叶斯网络推理之最大可能解释问题(基于FullBNT-1.0.4的MATLAB实现)
- 基于Matlab的BP神经网络在非线性函数拟合中的应用
- 基于MATLAB的小波阈值去噪
- 基于MATLAB的简单函数调用