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