C++算法进制间的转换

进制间的转换

进制转换方法是什么?

进制转换的方法是:二进制数,十六进制数可以采用按权展开法转化为十进制数,十进制转化为R进制要分为两部分,其中整数部分要除R取余,直到商为0,小数部分要乘R取余直到得到整数。
在这里插入图片描述

进制也就是进制位,对于接触过电脑的人来说应该都不陌生,我们常用的进制包括:二进制、八进制、十进制与十六进制,它们之间区别在于数运算时是逢几进一位。比如二进制是逢2进一位,十进制也就是我们常用的0-9是逢10进一位。接下来将在文章中为大家详细介绍,并在最后,利用C++编写16进制数转换为8进制数,16进制转换为10进制,10进制转换为2、8、16进制,附带代码,希望对大家有所帮助。

一、简述
进位计数制:是人们利用符号来计数的方法。一种进位计数制包含一组数码符号和两个基本因素。

  1. 数码:用不同的数字符号来表示一种数制的数值,这些数字符号称为“数码”。
  2. 基:数制所使用的数码个数称为”基”。
  3. 权:某数制每一位所具有的值称为”权”。

二:进制转换的理论

  1. 二进制数、十六进制数转换为十进制数

    用按权展开法把一个任意R进制数
    an an-1 …a1a0 . a-1 a-2…a-m
    转换成十进制数,其十进制数值为每一位数字与其位权之积的和。
    an×R n + an-1×R n-1 +…+ a1×R 1 + a0×R 0 + a-1 ×R-1+ a-2×R-2+ …+ a-m×R-m

  2. 十进制转化成R进制

    十进制数轮换成R进制数要分两个部分:
    整数部分:除R取余数,直到商为0,得到的余数即为二进数各位的数码,余数从右到左排列(反序排 列)。
    小数部分:乘R取整数,得到的整数即为二进数各位的数码,整数从左到右排列(顺序排列)。

  3. 十六进制转化成二进制

    每一位十六进制数对应二进制的四位,逐位展开。

  4. 二进制转化成十六进制

    将二进制数从小数点开始分别向左(对二进制整数)或向右(对二进制小数)每四位组成一组,不足四位补零。

另外增加一篇学习过程中,对我帮助很大的一篇文章: 二进制与8,10,16转换

三:十六进制转八进制代码

#include<iostream>
#include<string>
using namespace std;
int main()
{
	int i,j,k;
    int n;//存放输入几个十六进制数
    string s1;//存放输入的十六进制数
    string s2;//存放二进制数
    cin>>n;
    for(i=0;i<n;i++)
    {
        cin>>s1;//依次输入十六进制数 例:39
        s2="";
        for(j=0;j<s1.length();j++)
        {
            switch (s1[j]) //依次转为2进制 例:39 s1[0]=3 s2=0011 ---- s1[1]=9 s2=0011+1001= 0011 1001
            {
                case '0':s2+="0000";break;
                case '1':s2+="0001";break;
                case '2':s2+="0010";break;
                case '3':s2+="0011";break;
                case '4':s2+="0100";break;
                case '5':s2+="0101";break;
                case '6':s2+="0110";break;
                case '7':s2+="0111";break;
                case '8':s2+="1000";break;
                case '9':s2+="1001";break;
                case 'A':s2+="1010";break;
                case 'B':s2+="1011";break;
                case 'C':s2+="1100";break;
                case 'D':s2+="1101";break;
                case 'E':s2+="1110";break;
                case 'F':s2+="1111";break;
                default:break;
            }
        }
        //将二进制数转为 八进制数 由数字逻辑所学知识  111(2)--->7(8) 即三位后进位 需要使得s2的长度能够对3整除
        if(s2.length()%3==1)
        {
            s2="00"+s2;
        }
        //8%3==2 需要补充一位  000111001 ---> 000 111 001
        if(s2.length()%3==2)
        {
            s2="0"+s2;
        }
		int flag=0;
        // i<7 即为 j(max)=6
        for(k=0;k<s2.length()-2;k+=3)
        {
            //字符串进行加减乘除操作 '1'-'0'=1 '0'-'0'=0
            int output=4*(s2[k]-'0')+2*(s2[k+1]-'0')+s2[k+2]-'0';
             //第一组 0 1 2 000 111 001
            //这里是为防止输入的十六进制数,输出的八进制数最前方有0的情况
            //同时在数据中间部分的0也要输出,否则输出错误
            /*
             * 931FA
             *
             * //010 010 011 "000" 111 111 010
             * 
             * */
            if(output)
            {
               flag=1;
            }
            if(flag)
            {
            	cout<<output;
			}
        }
        cout<<endl;
    }
    return 0;
}

四:十六进制转十进制代码

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s1,s2;
    int i,j;
    long long sum=0;
    s2="";
    cin>>s1;
    for(i=0;i<s1.length();i++)
    {
       switch(s1[i]){
           case '0':s2+="0000";break;
           case '1':s2+="0001";break;
           case '2':s2+="0010";break;
           case '3':s2+="0011";break;
           case '4':s2+="0100";break;
           case '5':s2+="0101";break;
           case '6':s2+="0110";break;
           case '7':s2+="0111";break;
           case '8':s2+="1000";break;
           case '9':s2+="1001";break;
           case 'A':s2+="1010";break;
           case 'B':s2+="1011";break;
           case 'C':s2+="1100";break;
           case 'D':s2+="1101";break;
           case 'E':s2+="1110";break;
           case 'F':s2+="1111";break;
           default:break;
       }
    }
    for(j=0;j<s2.length();j++)
    {
        sum=sum*2+s2[j]-'0';
    }
    cout<<sum;
    return 0;
}

五:十进制转十六进制代码

#include<iostream>
#include<stack>
using namespace std;
int main()
{
    //十进制数
    long long n;
    //基:16 2为二进制,8为八进制
    int base=16;
    cin>>n;
    //创建栈
    stack<char>S;
    char a[]="0123456789ABCDEF";
    if(n==0) S.push(a[0]);
    //余数进栈
    while(n>0)
    {
        S.push(a[n%base]);
        n/=base;
    }
    //十六进制出栈
    while(!S.empty())
    {
        cout<<S.top();
        S.pop();
    }
}
  • 10
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值