关于进制转换的问题

  在c#和c++的学习过程中,最常用的一些个案例就是进制之间的转换。进制转换既是计算机学习中基础,对有些初学者而言也比较困难,但是在网上搜索时却没有发现比较好的代码。所以就整理了一点关于进制转换的代码和思路以供参考。

首先,进制转换主要是两个大类:

1.10进制转换到其他进制。

2.其他进制转换成10进制。

在我们的常用进制中,主要是2进制 8进制 和16进制。但是在进制转换的公式中其实是可以推广到任意进制的,只是有些进制在最终结果的处理上稍有不同下面将以2进制作为例子说明。

2进制转换为10进制。

在任意进制转换为10进制的过程中,主要是相位的累乘和相加。

比如1101转换成10进制。

2*2*2*1+2*2*1+2*0+1(2的0次方)*1=13

如果是8进制。

27(8进制)

8*2+7*1(8的0次方)=23

其他任意进制都可以这样进行10进制的转换

我们可以得到一个公式,假如有一个数abc,这个数的进制为x。

a*x*x+b*x+c*1(任何数的0次方都是1,以下不在解释)=y(这个数对应的10进制数)

以下是c#的代码:

public void htoten(string ba,int q)//其他进制在这里输入的是字符串格式 
        {
            int t = 0;//t用来储存我们将要累加的数
            int w = 1;//用来储存我们相位不同的时候对应的次方数。
            for (int i = ba.Length - 1; i >= 0; i--)//用一个for循环来控制,同时将一串数字分离
            {
                int n = ba[i] - '0';//将分离后的数字转换成10进制方便下面的计算
                if (n >= 17)
                { n = n - 7;}//这个是16进制的转换(只考虑了16进制大写情况,小写情况类似处理)
                  t = t + n * w;//和上面的例子相同,不同的相位,乘上不同的数并累加
                  w = w * q;//相位的改变,q是当前这个数的进制
              
            }
            r = t;
            Console.WriteLine("这个数的10进制为:{0}", r);//输出
        }

在c++的代码中,和这个高度相似,就不再赘述了。

接下来是10进制转换到任意进制,方法都是一样的,只是进制的不同所要求余的数不同而已。

以10进制转换2进制为例

15(转到2进制)

15/2=7余1

7/2=3余1

3/2=1余1

1/2=0余1

从下面记上去 1111 任意进制都市报一样的求余后从后面开始计数

143(转到8进制)

147/8=18余3

18/8=2余2

2/8=0余2

所以这个数的8进制是223

如果这个数比较小57

直接可以得出71 其余进制相似。

好了 直接上c#代码

 public string tentob(int r, int b)//r是当前的10进制数,b是要转换的进制
        {
            if (b != 16)//当不转换到16进制
            {
                string j = "";//用一个字符变量来储存
                while (r > 0)//当日部位0的时候循环进行下面的运算
                {
                    int c = r % b;//对这个数进行求余运算
                    j = c.ToString() + j;//将得出的结果倒序记录在j上
                    r = r / b;//r除以将要转换的进制
                }
                return j;//运算结束 返回j这个字符串
            }
            else//如果要转换到16进制
            {
                string k = "", c = "";
                while (r > 0)//依旧用函数控制
                {
                    int x = r % b;//得到求余的值如果小于16 则在下面的switch中得到对应的字母
                    switch (x)
                    {
                        case 10: c = "A"; break;
                        case 11: c = "B"; break;
                        case 12: c = "C"; break;
                        case 13: c = "D"; break;
                        case 14: c = "E"; break;
                        case 15: c = "F"; break;
                        default: c = x.ToString(); break;//找到对应的大写字母后用c来记录
                    }
                    k = c + k;//k是记录无论是否有大写字母还是无
                    r = r / b;//除以进制
                }
                return k;//返回这个进制的字符串
            }
        }

呃,c++的代码类似啊,哈哈。 c++不能调用c#里面的length函数和ToString函数,可以将数字转换成字符也可以的 而且在c++中转16进制的时候用字符可以直接用ascll码得到大写字母, 比这个还要简单。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值