1.首先是二進制,八進制,十六進制轉十進制.
每一個進制(二進制,八進制,十六進制)的從右往左數,
第一位的權值就是對應進制的0次方,第二位的權值就是對應進制的二次方
,以此類推,然后對應位的數乘以對應位的權值再相加起來就是該進制對應的十進制的數是多少.
例:十六進制2AF5換算成十進制:
用豎式計算:
第0位: 5 * 16^0 = 5
第1位: F * 16^1 = 240
第2位: A * 16^2= 2560
第3位: 2 * 16^3 = 8192
相加等于10997.
直接計算就是:
5 * 16^0 + F * 16^1 + A * 16^2 + 2 * 16^3 = 10997
其他進制轉十進制方法一樣.
有小數的次方就跟著減.
例十六進制的0.1轉10進制,就是1*16^-1,然后以此類推.(其他進制也是如此)
2:八進制,十進制,十六進制轉二進制.
(先講這個,因為后面很多需要利用二進制作為中間轉換)
#I: 八進制換二進制
八進制轉二進制:
整數部分:從后往前每一位按十進制轉化方式轉化為三位二進制數,缺位處用0補充 .
(想也知道,因為二進制的111剛好是7,所以就可以根據這個來進行轉化)
例如:11001補充后是011001.
八進制數換成二進制:0=000;1 = 001;2 = 010;3 =011;4 = 100;5 = 101;6 =110;7 = 111
011=3,001=1,所以31(八進制)=011001(二進制)
#III:十進制換二進制
1. 十進制整數轉換為二進制整數
十進制整數轉換為二進制整數采用"除2取余,逆序排列"法。
具體做法是:用2整除十進制整數,可以得到一個商和余數;
再用2去除商,又會得到一個商和余數,如此進行,直到商為0時為止,
然后把先得到的余數作為二進制數的低位有效位,
后得到的余數作為二進制數的高位有效位,依次排列起來。
十進制整數轉二進制
如:(255)10=(11111111)2
255/2=127=====余1
127/2=63======余1
63/2=31=======余1
31/2=15=======余1
15/2=7========余1
7/2=3=========余1
3/2=1=========余1
1/2=0=========余1
就是這樣來的.
#II:十六進制換二進制
首先把十六進制數04271544中的每一位數轉換為二進制數,每個數要分四位,不足四位的前面加零,請看下面演示:
0 0000
4 0100
2 0010
7 0111
1 0001
5 0101
4 0100
4 0100
將得出四位二進制數串連起來就是結果了
所以,十六進制04271544轉換二進制為
100001001110001010101000100 (前面的0就省了)
3: 二進制,八進制,十進制轉十六進制.
#I:二進制轉十六進制
16進制就有16個數,0~15,用二進制表示15的方法就是1111,
從而可以推斷出,16進制用2進制可以表現成0000~1111,顧名思義,也就是每四個為一位。舉例:
00111101可以這樣分:
0011|1101(最高位不夠可用零代替),對照著二進制的表格,1024 512 256 128 64 32 16 8 4 2 1
(一般例舉這么多就夠了,如果有小數的話就繼續往右邊列舉,如0.5 0.25 0.125 0.0625……)
1024 512 256 128 64 32 16 8 4 2 1
0 0 1 1| 1 1 0 1
左半邊=2+1=3 右半邊=8+4+1=13=D
結果,0111101就可以換算成16進制的3D.
#II:八進制換十六進制
這個轉化沒有現成的轉化方式,只能先將八進制換成二進制,然后再轉換成十六進制.所以方法就是這樣.(轉化方式上面有)
八進制轉換為16進制數,使用二進制作為中間結果會比使用十進制還簡單,例如:
八進制的:1234567
轉換為二進制是每個數字轉換為三位二進制:001 010 011 100 101 110 111
然后把這些數字從右邊開始進行按四位分組:0 0101 0011 1001 0111 0111
然后從右邊每四位組依次對應一個16進制數:053977
即 (1234567)8=(053977)16
#II:十進制轉十六進制
例:十進制的1610(有了二進制換十六進制的基礎,就有兩種方法)
直接轉16進制:
1610/16=100……10(A);//想想他們之間的關系,就知道為什么要除了.
100 /16= 6……4;
6 /16= 0……6;
故:1610(10)=64A(16).
先轉2進制:
1610/2=805……0;
805 /2=402……1;
402 /2=201……0;
201 /2=100……1;
100 /2=50 ……0;
50 /2=25 ……0;
25 /2=12 ……1;
12 /2=6 ……0;
6 /2=3 ……0;
3 /2=1 ……1;
1 /2=0 ……1.
1610(10)= 0110 0100 1010(2)
1610(10)= 64A(16)
4:二進制,十進制,十六進制轉八進制.
有了上面的基礎,這里就只說說十六進制換八進制
是 先轉化成2進制,再轉換成8進制:
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
A 1010
B 1011
C 1100
D 1101
E 1110
F 1111
先每四位一組轉換成2進制
例如:
3BC24
分別對應到上表 就是:
3 0011
B 1011
C 1100
4 0100
連起來就是:
0011 1011 1100 0100
再按照每三個一組分組:
0 011 101 111 000 100
對應到8進制:
(其實跟上表的前一半是一樣的):
0 000
1 001
2 010
3 011
4 100
5 101
6 110
7 111
0 011 101 111 000 100
0__3__5__7__0__4
所以8進制就是35704
即(3BC24 )16=(035704)8.
其實你會發現10進制轉任何進制就是用那個十進制的數除以那個進制,然后再倒著書寫即可.
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
char a[150];
int b[150];
int cnt=0;
void shizhuanji(int x,int jz)
{
if(x/jz)
shizhuanji(x/jz,jz);
cout << x%jz;
}
int main()
{
int n,jz;
cin >> n >> jz;
printf("十進制的%d轉成%d進制為",n,jz);
shizhuanji(n,jz);
printf("\n");
}
而其他進制換十進制就是對應位權值的關系即可
代碼如下:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
char a[150];
int b[150];
int cnt=0;
void jizhuanshi(int jz,int *x)
{
int s=0;
int ans=0;
for(int i=0;i<cnt;i++)
{
double m=pow(jz,ans);//pow的原型是浮點數,所以必須要用一個db型做中間橋梁!
//printf("%.2f %d\n",m,x[i]);//幫助理解過程.
s+=x[i]*m;
ans++;
//printf("%d\n",s);
}
printf("%d進制的%s轉換成十進制為%d\n",jz,a,s);
}
int main()
{
int jz;
cin >> jz;
scanf("%s",a);
int len=strlen(a);
for(int i=len-1;i>=0;i--) b[cnt++]=a[i]-'0';
jizhuanshi(jz,b);
}
而2,8,16,進制因為數的特殊性常常就用幾位代表一個數來進行他們之間的相互轉換.(這個代碼看完后就自己寫了哈)(其實也不難,很好寫的)
所以希望看完這個你能懂起進制之間的關系.