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進制),是從二進制的低位開始三個一組來計算。
- 代碼
