如何将二进制转换为八进制、十进制、十六进制

来源:互联网 发布:知乎便宜的女生手链 编辑:程序博客网 时间:2024/04/27 19:09

值得注意的是,存放二进制的数组最后一位才是二进制的第一位,例如:char bin[5]=”1100”,那么bin[3] 才是二进制的第一位.

1.二进制–>八进制
二进制转换为八进制是非常简单的,因为每三个二进制就是一位八进制.如果不足三位二进制则补0.
例如: 10101 –>010 101 –>25
1101 –> 001 101 –> 15
思路有了,接下来就是把思路转换为代码写出来即可.

代码如下:

long long BinToOct(char* bin){    long long oct = 0;    //八进制    char* b = bin;            int a = 0, p = 0;    int i = 0, iLen = 0, k = 0;    while (*b++) ++iLen;    //计算二进制的长度    while (iLen--)    {        a += powl(2, k++) * (bin[iLen] - '0');        if (k % 3 == 0) //每三位二进制就是一位八进制(a就是一位八进制)        {            oct += powl(10, p++)*a;            a = 0;            k = 0;        }    }//如果最后没有构成三位二进制,则不会进入到if语句,也就是会少加一次,这里要补回来    return oct += powl(10, p++)*a;;}

注意:这个函数最大支持57位2进制的转换
2.二进制 –> 十进制
这个就太简单了,直接求权值和就行了

long long BinToDec(char* bin){    long long dec = 0;    char* b = bin;    int iLen = 0, p = 0;    while (*b++) ++iLen;    while (iLen)        dec += powl(2, p++)*(bin[--iLen] - '0');    return dec;}

注意:最大支持63位2进制的转换
3.二进制 –> 十六进制
这个的思路和八进制一样,只不过这里是4个为一组

void BinToHex(char* bin, char* hex, int n = 20){    char a[17] = "0123456789ABCDEF";    char* temp = (char*)malloc(n);    memset(temp, 0, n);    char* b = bin;    int iLen = 0;    int i = 0, k = 0, q = 0;    while (*b++) ++iLen;     while (iLen)    {        q += powl(2, k++)*(bin[--iLen] - '0');        if (k % 4 == 0)        {   //假设第一组二进制位1010,所以q=10,a[10] == 'A'            temp[i++] = a[q];            q = 0;            k = 0;        }    }    if ((i % 4 && q) || i == 0)//防止k!=4漏加了一个        temp[i++] = a[q];    k = 0;    while (i)        hex[k++] = temp[--i];//反转过来    free(temp);}

参数n = 20 是缺省值,C++才支持,为什么我要这样写呢?因为二进制和十六进制都是用数组保存的,所以,它们之间的转换没有限制,所以我用了动态分配内存,而大小就是传进来的n.

0 0
原创粉丝点击