1. 程式人生 > >各種進位制轉換(二,八,十,十六進位制間轉換)詳解附程式碼

各種進位制轉換(二,八,十,十六進位制間轉換)詳解附程式碼

進位制轉換

    

原理

進位制轉換是人們利用符號來計數的方法。進位制轉換由一組數碼符號和兩個基本因素“基數”與“位權”構成。

基數是指,進位計數制中所採用的數碼(數制中用來表示“量”的符號)的個數。

 位權是指,進位制中每一固定位置對應的單位值。

 在知乎有個問題下的解答很不錯,可以參考:開啟連結

他們之間的關係如下:

wpsC01D.tmp

 

接下來我們一一闡述。

一:(二,八,十六進位制)轉十進位制

 

方法:假設我們要將n進位制轉換為十進位制,首先我們從n進位制的右邊為第一位數(從低位到高位),其權值是n的0次方,第二位是n的1次方,依次遞增下去,把最後的結果相加的值就是十進位制的值了。

 

舉個例子:將(1101)n  轉換為十進位制

(1101)n  =  1*(n)^3  + 1 * (n) ^ 2  +  0 * (n) ^ 1 + 0 * (n) ^ 0 ;

如:(1101) 2  =  1*(2)^3  + 1 * (2) ^ 2  +  0 * (2) ^ 1 + 0 * (2) ^ 0  =  12;

八進位制,十六進位制同樣如此。

例:將十六進位制的(2B)H轉換為十進位制的步驟如下:

1. 第0位 B x 16^0 = 11;

2. 第1位 2 x 16^1 = 32;

3. 讀數,把結果值相加,11+32=43,即(2B)H=(43)D。

 

二:十進位制 轉換為(二,八,十六進位制)

 

假設我們要將十進位制轉換為n進位制

方法:除n取餘法,即每次將整數部分除以n,餘數為該位權上的數,而商繼續除以n,餘數又為上一個位權上的數,這個步驟一直持續下去,直到商為0為止,最後讀數時候,從最後一個餘數讀起,一直到最前面的一個餘數。

十進位制轉換二進位制

 

例:將十進位制的(796)D轉換為十六進位制的步驟如下:

1. 將商796除以16,商49餘數為12,對應十六進位制的C;

2. 將商49除以16,商3餘數為1;

3. 將商3除以16,商0餘數為3;

4. 讀數,因為最後一位是經過多次除以16才得到的,因此它是最高位,讀數字從最後的餘數向前讀,31C,即(796)D=(31C)H。

下面轉載自https://www.cnblogs.com/gaizai/p/4233780.html

(三) (二進位制) ↔ (八、十六進位制)

wpsC044.tmp

(Figure9:二進位制轉換為其它進位制)

  • 二進位制 → 八進位制

  方法:取三合一法,即從二進位制的小數點為分界點,向左(向右)每三位取成一位,接著將這三位二進位制按權相加,然後,按順序進行排列,小數點的位置不變,得到的數字就是我們所求的八進位制數。如果向左(向右)取三位後,取到最高(最低)位時候,如果無法湊足三位,可以在小數點最左邊(最右邊),即整數的最高位(最低位)添0,湊足三位。

  例:將二進位制的(11010111.0100111)B轉換為八進位制的步驟如下:

1. 小數點前111 = 7;

2. 010 = 2;

3. 11補全為011,011 = 3;

4. 小數點後010 = 2;

5. 011 = 3;

6. 1補全為100,100 = 4;

7. 讀數,讀數從高位到低位,即(11010111.0100111)B=(327.234)O。

wpsC054.tmp

(Figure10:圖解二進位制 → 八進位制)

二進位制與八進位制編碼對應表:

二進位制

八進位制

000

0

001

1

010

2

011

3

100

4

101

5

110

6

111

7

 

  • 八進位制 → 二進位制

  方法:取一分三法,即將一位八進位制數分解成三位二進位制數,用三位二進位制按權相加去湊這位八進位制數,小數點位置照舊。

  例:將八進位制的(327)O轉換為二進位制的步驟如下:

1. 3 = 011;

2. 2 = 010;

3. 7 = 111;

4. 讀數,讀數從高位到低位,011010111,即(327)O=(11010111)B。

wpsC055.tmp

(Figure11:圖解八進位制 → 二進位制)

  • 二進位制 → 十六進位制

  方法:取四合一法,即從二進位制的小數點為分界點,向左(向右)每四位取成一位,接著將這四位二進位制按權相加,然後,按順序進行排列,小數點的位置不變,得到的數字就是我們所求的十六進位制數。如果向左(向右)取四位後,取到最高(最低)位時候,如果無法湊足四位,可以在小數點最左邊(最右邊),即整數的最高位(最低位)添0,湊足四位。

  例:將二進位制的(11010111)B轉換為十六進位制的步驟如下:

1. 0111 = 7;

2. 1101 = D;

3. 讀數,讀數從高位到低位,即(11010111)B=(D7)H。

wpsC056.tmp

(Figure12:圖解二進位制 → 十六進位制)

  • 十六進位制 → 二進位制

  方法:取一分四法,即將一位十六進位制數分解成四位二進位制數,用四位二進位制按權相加去湊這位十六進位制數,小數點位置照舊。

  例:將十六進位制的(D7)H轉換為二進位制的步驟如下:

1. D = 1101;

2. 7 = 0111;

3. 讀數,讀數從高位到低位,即(D7)H=(11010111)B。

wpsC057.tmp

(Figure13:圖解十六進位制 → 二進位制)

(四) (八進位制) ↔ (十六進位制)

wpsC058.tmp

(Figure14:八進位制與十六進位制之間的轉換)

  • 八進位制 → 十六進位制

  方法:將八進位制轉換為二進位制,然後再將二進位制轉換為十六進位制,小數點位置不變。

  例:將八進位制的(327)O轉換為十六進位制的步驟如下:

1. 3 = 011;

2. 2 = 010;

3. 7 = 111;

4. 0111 = 7;

5. 1101 = D;

6. 讀數,讀數從高位到低位,D7,即(327)O=(D7)H。

wpsC069.tmp

(Figure15:圖解八進位制 → 十六進位制)

  • 十六進位制 → 八進位制

  方法:將十六進位制轉換為二進位制,然後再將二進位制轉換為八進位制,小數點位置不變。

  例:將十六進位制的(D7)H轉換為八進位制的步驟如下:

1. 7 = 0111;

2. D = 1101;

3. 0111 = 7;

4. 010 = 2;

5. 011 = 3;

6. 讀數,讀數從高位到低位,327,即(D7)H=(327)O。

wpsC06A.tmp

擴充套件

負數的進位制轉換稍微有些不同。

先把負數寫為其補碼形式(在此不議),然後再根據二進位制轉換其它進位制的方法進行。

包含小數的進位制換算:

(ABC.8C)H=10x16^2+11x16^1+12x16^0+8x16^-1+12x16^-2

=2560+176+12+0.5+0.046875

=(2748.546875)D

程式碼

下面程式碼來源百科(懶~)

十進位制轉換k進位制

#include<cstdio>
#include<iostream>
#include<ctime>
char a[1000];
using namespace std;
int main()
{
    int y=0,k,n,x;
    char z='A';
    scanf ("%d %d",&n,&x);
    while (n!=0)
    {   
          y++;
             a[y]=n%x;
          n=n/x;
          if (a[y]>9) a[y]=z+(a[y]-10); 
          else a[y]=a[y]+'0';
    }
    for (int i=y;i>0;i--)
    printf ("%c",a[i]);
    return 0;
}

m進位制轉換十進位制

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
char a[10000];
using namespace std;
int main()
{
   int n,m;
   int f=0;
   scanf ("%s%d",a,&m);
   for (int i=0;i<strlen(a);i++)
   {
        f*=m;
        if (a[i]=='A'||a[i]=='B'||a[i]=='C'||a[i]=='D'||a[i]=='E'||a[i]=='F')
        {
            f=f+(a[i]-'A'+10);
        }
        else
        {
            f=f+(a[i]-'0');
        }
   }
   printf ("%d",f);
   return 0;
}

注:用C語言的格式化輸入輸出可以快速轉換10進位制,8進位制和16進位制。例子:10進位制轉16進位制:

#include <cstido>
 
int main()
{
    int a;
    scanf("%d",&a);
    printf("%x",a);
    return 0;
}

花費不少時間總結在一起了,望有用。