• C/C++<算法>进制转换超详细


    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个数,015,用二进制表示15的方法就是1111,从而可以推断出,16进制用2进制可以表现成00001111,顾名思义,也就是每四个为一位
    
    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进制),是从二进制的低位开始三个一组来计算。
    • 代码
    
    
  • 相关阅读:
    GNU make manual 翻译(四十一)
    GNU make manual 翻译(三十五)
    GNU make manual 翻译(三十三)
    GNU make manual 翻译(三十八)
    GNU make manual 翻译(四十二)
    GNU make manual 翻译(三十四)
    艾瑞咨询:即时通讯面临多种安全威胁 狼人:
    世界头号黑客称奥巴马超级加密黑莓手机可被攻破 狼人:
    微软悬赏25万美元捉拿Conficker蠕虫作者 狼人:
    信息周刊:随意设置电脑密码存在安全隐患 狼人:
  • 原文地址:https://www.cnblogs.com/dgwblog/p/8054172.html
Copyright © 2020-2023  润新知