首页 > 代码库 > 进制转换函数

进制转换函数

一般常用到的进制转换大概就是二进制与十进制,十进制与十六进制,二进制与十六进制之间的转换,好像<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函数应该不难)。由于笔者突然不想写代码了,这个转换函数就不放代码了。

 

进制转换函数