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