16转10
- 用竖式计算:
16进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方
第0位: 5 * 16^0 = 5
第1位: F * 16^1 = 240
第2位: A * 16^2= 2560
第3位: 2 * 16^3 = 8192
-代码
#include <iostream>
#include <string>
using namespace std;
int main() {string s;while(cin>>s){int length=s.length();long long sum=0;for(int x=0;x<length;x++){if(s[x]>='0'&&s[x]<='9'){sum=(s[x]-'0')+16*sum;}else{sum=(s[x]-'A'+10)+16*sum;}}cout<<sum;}return 0;
}
16转2
- 由于在二进制的表示方法中,每四位所表示的数的最大值对应16进制的15,即16进制每一位上最大值,所以,我们可以得出简便的转换方法,将16进制上每一位分别对应二进制上四位进行转换
#include <iostream>
#include <string>
using namespace std;
int main() {string s;while(cin>>s){int length=s.length();long long sum=0;int answer[40];int cot=0;for(int x=0;x<length;x++){int y=2;if(s[x]>='0'&&s[x]<='9'){y=(s[x]-'0');}else{y=(s[x]-'A'+10);}do{answer[cot++]=y%2;y/=2;}while(y!=0);}for(int i=0;i<cot;i++){cout<<answer[cot-1-i];}}return 0;
}
2转16进制
- 16进制就有16个数,0~15,用二进制表示15的方法就是1111,从而可以推断出,16进制用2进制可以表现成0000~1111,顾名思义,也就是每四个为一位
0 0 1 1| 1 1 0 1
左半边=2+1=3 右半边=8+4+1=13=D
- 代码
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {string s;while(cin>>s){int length=s.length();string s2;int pro=1,sum=0,cot=0;for(int x=length-1;x>=0;x--){sum+=(s[x]-'0')*pro;pro=pro*2;if(x%4==0){if(sum>=10){s2+=sum-10+'A';}else{s2+=sum+'0';}pro=1;sum=0;}}reverse(s2.begin(),s2.end());cout<<s2;}return 0;
}
10进制转16进制
-代码
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {long long s;while(cin>>s){char ans[20]={0};int cot=0;do{if(s%16>=10){ans[cot++]=s%16-10+'A';}else{ans[cot++]=s%16+'0';}s/=16;}while(s);for(int i=0;i<cot;i++){cout<<ans[cot-1-i];}}return 0;
}
十六进制转八进制
- 一开始想的是把16进制先转化为10进制,因为从10进制转化为8进制很容易。但是题目中输入的16进制位数规模大,不超过100000位,肯定不能化为10进制数。解法是先把16进制化为四个2进制数,然后三个二进制数一组再化为8进制。 注意 39(16进制)--〉0011 1001 (2进制) --〉111 001(8进制),是从二进制的低位开始三个一组来计算。
- 代码