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