前言
閑着沒事寫寫玩玩的。
目錄
1.十進制轉二進制/八進制/十六進制
2.二進制/八進制/十六進制轉十進制
3.二進制/八進制/十六進制之間的互相轉換
1.十進制轉二進制/八進制/十六進制
1.1.十進制轉二進制
數學上的方法是除以2,倒取余數,例如:
按照從下往上的順序寫,就是1010.
那么代碼上面,只需要一個循環即可:
while(dec){
bin[k]=dec%2;
dec/=2;
k++;
}
注意是倒取余數,因此輸出的時候翻轉一下即可,從k-1到0.
#include<iostream>
#include<stdio.h>
int dec;
int bin[100];
int main(){
scanf("%d",&dec);
int k=0;
while(dec){
bin[k]=dec%2;
dec/=2;
k++;
}
for(int i=k-1;i>=0;i--){
printf("%d",bin[i]);
}
}
1.2.十進制轉八進制
毫無難度,和之前上面的寫法一樣,只是把2換成8.
#include<iostream>
#include<stdio.h>
int dec;
int oct[100];
int main(){
scanf("%d",&dec);
int k=0;
while(dec){
oct[k]=dec%8;
dec/=8;
k++;
}
for(int i=k-1;i>=0;i--){
printf("%d",oct[i]);
}
}
1.3.十進制轉十六進制
注意:十六進制中包含數碼ABCDEF,因此輸出時需要經過特殊轉換。方法是在輸出的時候加上一個switch case。
#include<iostream>
#include<stdio.h>
int dec;
int hex[100];
int main(){
scanf("%d",&dec);
int k=0;
while(dec){
hex[k]=dec%16;
dec/=16;
k++;
}
for(int i=k-1;i>=0;i--){
if(hex[i]<=9)printf("%d",hex[i]);
else{
switch(hex[i]){
case 10:putchar('A');break;
case 11:putchar('B');break;
case 12:putchar('C');break;
case 13:putchar('D');break;
case 14:putchar('E');break;
case 15:putchar('F');break;
}
}
}
}
2.二進制/八進制/十六進制轉十進制
2.1.二進制轉十進制
二進制的每一位都有對應的權值,類似十進制個位表示1,十位表示10,百位表示100等,二進制第一位表示1,第二位2,第三位4,第四位8,以此類推。
如圖,把每一位權值乘以這一位的數字即可。
注意在寫的時候,語法方面的一些小問題,寫在注釋里面了:
#include<iostream>
#include<stdio.h>
#include<string.h>
int dec;
char bin[100];
int main(){
fgets(bin,sizeof(bin),stdin);
//也可用gets(bin)代替,但是gets被標准列為不安全的函數,並且在部分環境會報錯
int p=1;//權值
for(int i=strlen(bin)-2;i>=0;i--){
//這里從strlen(bin)-2開始,因為fgets會把換行符一起讀入進來,從strlen(bin)-1開始會有問題
dec+=p*(bin[i]-'0');
p*=2;
}
printf("%d",dec);
}
2.2.八進制轉十進制
只是把權值從每次乘2到乘8,其他無變化。
#include<iostream>
#include<stdio.h>
#include<string.h>
int dec;
char oct[100];
int main(){
fgets(oct,sizeof(oct),stdin);
int p=1;//權值
for(int i=strlen(oct)-2;i>=0;i--){
dec+=p*(oct[i]-'0');
p*=8;
}
printf("%d",dec);
}
2.3.十六進制轉十進制
注意,這里十六進制中有A-F的字母,這里我考慮用到一個辦法,使用ref數組,ref[c]就表示c字符對應的數字,例如ref['A']=10。
代碼如下,最前面預處理了ref數組的值。
#include<iostream>
#include<stdio.h>
#include<string.h>
int dec;
char hex[100];
int ref[255];
int main(){
for(int i='0';i<='9';i++){
ref[i]=i-'0';
}
for(int i='A';i<='F';i++){
ref[i]=i-'A'+10;
}
fgets(hex,sizeof(hex),stdin);
int p=1;//權值
for(int i=strlen(hex)-2;i>=0;i--){
dec+=p*ref[hex[i]];
p*=16;
}
printf("%d",dec);
}
3.二進制/八進制/十六進制之間的互相轉換
我們知道,這類進制之間的轉換,可以使用三/四位一段的方法,例如:
就是把0x1234轉二進制的結果。
這里只以十六進制轉二進制為例,我們可以使用數組存儲。
#include<iostream>
#include<stdio.h>
#include<string.h>
char* bin[16]={
"0000","0001","0010","0011","0100","0101","0110","0111",
"1000","1001","1010","1011","1100","1101","1110","1111",
};
char hex[100];
int ref[255];
int main(){
for(int i='0';i<='9';i++){
ref[i]=i-'0';
}
for(int i='A';i<='F';i++){
ref[i]=i-'A'+10;
}
fgets(hex,sizeof(hex),stdin);
for(int i=0;i<strlen(hex)-1;i++){
printf("%s",bin[ref[hex[i]]]);
}
return 0;
}
全文完。