任意进制之间的相互转化:
第一种,常规的先通过运算转换成10进制,再转换成指定进制
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void conver(string sum,string &s2,ll jz,ll k){
ll num=0,t;
for(int i=0;i<sum.size();i++){
if(sum[i]>='0' && sum[i]<='9')
t=sum[i]-'0';
else
t=sum[i]-'A'+10;
num=num*jz+t;
}
s2="";
while(num){
t = num%k;
num/=k;
if(t<=9) s2=to_string(t)+s2;
else s2 = (char)((t-10+'A'))+s2;
}
}
int main(){
string s2;
conver("A2",s2,16,10);//把16进制的A2变成10进制
cout<<s2;//162
return 0;
}
第二种:先用数组保存10进制对应的各个进制(A-Z)的数和各个进制的字母对应的10进制的数,然后对照数组还原,适用于多次进制的转换和多次进制直接的运算;
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<ll,char> eco;//10进制的数对应各个进制的符号
map<char,ll> deco;//各个进制的符号对应10进制的数
void init(){
for(ll i= 0;i <= 9; i++){
eco[i] = i+'0';
deco[i+'0'] = i;
}
for(ll i = 'A';i <= 'Z'; i++){
eco[i-'A'+10] = i;
deco[i] = i-'A'+10;
}
}
void pout(ll tnum,int jz){ //把10进制转换成任意进制
if(tnum==0){
printf("0\n");return;
}
int cnt[99]={0};
while(tnum){
if(tnum/jz){
cnt[++cnt[0]]=tnum%jz;
tnum/=jz;
}
else{
cnt[++cnt[0]]=tnum;
tnum/=jz;
}
}
for(int i = cnt[0];i>0;i--){
printf("%c",eco[cnt[i]]);
}
printf("\n");
}
void getnum(string num,int jz){//把任意进制转换成10进制
ll ret=0,tmp=1;
for(int i=num.size()-1;i>=0;i--){
ret+=tmp*deco[num[i]];
tmp*=jz;
}
printf("%lld",ret);
}
int main(){
init();
pout(162,16);//A2 ,162的16进制
getnum("A2",16); //162 16进制的A2
return 0;
}
转二进制:
bitset用法:https://www.cnblogs.com/magisk/p/8809922.html
bitset一般用来转2进制
#include<bits/stdc++.h>
using namespace std;
int main(){
int a=15;
bitset<13> m(a); //长度为13,前面用0补充
cout<<m;//0000000001111
return 0;
}
位运算 &+>>:
用&来取出最后一位二进制,在左移;
#include<bits/stdc++.h>
using namespace std;
stack<int> s;
int main(){
int a=8;
while(a){
if(a&1) s.push(1);
else s.push(0);
a>>=1;
}
while(!s.empty()){
cout<<s.top();
s.pop();
}//1000
return 0;
}
最后提一下printf自带的:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a=15;
printf("%o\n",a);//17 转换成8进制
printf("%x\n",a);//f 转换成16进制
return 0;
}