您的位置:首页 > 编程语言 > C语言/C++

关于进制转换的问题

2017-07-27 16:28 281 查看
  在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码得到大写字母, 比这个还要简单。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c# c++ 进制转换