基於MATLAB的進制轉換

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;

·    第二位 (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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章