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

值得注意的是,存放二进制的数组最后一位才是二进制的第一位,例如: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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值