码迷,mamicode.com
首页 > 其他好文 > 详细

进制转换函数

时间:2016-09-08 10:02:54      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:

一般常用到的进制转换大概就是二进制与十进制,十进制与十六进制,二进制与十六进制之间的转换,好像<stdlib.h>里的itoa函数可以做一些进制转换,不过我还是想自己造造轮子。二进制或十六进制转到十进制很简单,比如我们要将二进制数1011转为十进制表示,你会发现,1011=101*2+1 而101=10*2+1,10=1*2+0,1=0*2+1,也就是说1011可以由((((0*2+1)*2+0)*2)+1)+1来表示,由于计算机在算这一串表达式时基于的是十进制,所以结果就自然而然地转为了十进制。十六进制也是一样的,唯一的差别在于,乘的数应该是16而非2。

int ToDec(char *a,int radix)
{
    int i;
    int dec = 0;
    for (i = 0; i < strlen(a); i++) {
        if (isdigit(a[i]))
            dec = dec * radix + (a[i] - 0);
        else if (a[i] >= a&&a[i] <= f)
            dec = dec * radix + (a[i] - a + 10);
        else if (a[i] >= A&&a[i] <= F)
            dec = dec * radix + (a[i] - A + 10);
        else {
            printf("error,please check your input\n");
            return -1;
        }
    }
    return dec;
}

将十进制转为二进制和八进制其实不过是将上面的过程逆过来而已,比如我们要将15转为二进制,那么我们只要用15%2就得到了最低位的数字1,然而我们(15/2)%2便得到了右起第二位的数字1,依次下去,我们便得到了15的二进制表示1111。十六进制转十进制也是基于同样的原理。

void decTo(int dec, char *arr, int radix)
{
    int i=0;
    int tmp;
    while (dec > 0) {
        if ((tmp = dec%radix) >= 0 && tmp < 10)
            arr[i++] = tmp+0;
        else if (tmp >= 10 && tmp <= 15)
            arr[i++] = A + (tmp - 10);
        else
            printf("error:radix bigger than hex");
        dec /= radix;
    }
    arr[i] = \0;
    _strrev(arr);
}

二进制与十六进制之间的转换也是十分简单,考虑到一个十六进制位对应四个二进制位。可以直接建立一张列表记录他们之间的对应关系(可以考虑用结构体数组充当列表),然后执行转换时查查表就是了,值得注意的是,当二进制数位数不为8的倍数时,有必要通过在前面添加0的方式将其补成8的倍数(用strncpy,strcmp,strcat函数应该不难)。由于笔者突然不想写代码了,这个转换函数就不放代码了。

 

进制转换函数

标签:

原文地址:http://www.cnblogs.com/evilkant/p/5851252.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!