1、十进制转换成八进制有两种方法:
(1)间接法:先将十进制转换成二进制,然后将二进制又转换成八进制。
(2)直接法:八进制是由二进制衍生而来的,因此可以采用与十进制转换为二进制相类似的方法,还是整数部分的转换和小数部分的转换,下面来具体讲解一下:
①整数部分
方法:除8取余法,即每次将整数部分除以8,余数为该位权上的数,而商继续除以8,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数起,一直到最前面的一个余数。
②小数部分
方法:乘8取整法,即将小数部分乘以8,然后取整数部分,剩下的小数部分继续乘以8,然后取整数部分,剩下的小数部分又乘以8,一直取到小数部分为零为止。如果永远不能为零,就同十进制数的四舍五入一样,暂取个名字叫3舍4入。
2、十进制的转换到十六进制:
十六进制与八进制有很多相似之处,可以参照上面八进制与十进制的转换实现这两个进制之间的转换。
十进转换为十六进制
////////////////////////////////////
10 进制 -----> 16 进制
int nDec = 10;
CString str;
str.Fomat(_T("%x"), nDec);
十进制转换为八进制:先将十进制转化到2进制,再由2进制到8进制
///////////////////////////////////////
10 进制 -----> 2 进制
CString DecToBin(CString strDec)
{
int nDec = atoi(strDec);
int nYushu, nShang;
CString strBin = _T(""), strTemp;
TCHAR buf[2];
BOOL bContinue = TRUE;
while ( bContinue )
{
nYushu = nDec % 2;
nShang = nDec / 2;
sprintf(buf, "%d", nYushu);
strTemp = strBin;
strBin.Format("%s%s", buf, strTemp);
nDec = nShang;
if ( nShang == 0 )
bContinue = FALSE;
}
int nTemp = strBin.GetLength()%4;
switch(nTemp)
{
case 1:
strTemp.Format(_T("000%s"), strBin);
strBin = strTemp;
break;
case 2:
strTemp.Format(_T("00%s"), strBin);
strBin = strTemp;
break;
case 3:
strTemp.Format(_T("0%s"), strBin);
strBin = strTemp;
break;
default:
break;
}
return strBin;
}
2 进制 -----> 8 进制
#include
#include
/* 以long型占4个字节为例 */
char *decimal2octal(long a)
{
static char res[16];
int i = 0, j = 0;
long t = (long)a;
memset(res, 0x00, sizeof(res));
if((a >> 31) & 0x1) /* 第一位为1则为负数,取补码 */
{
t = ~a + 1;
res[i++] = '-';
}
res[i++] = ((t >> 30) & 0x1) + '0';
/* 每3个二进制位转一个8进制位 */
for(j = 3 ; j <= 30; j += 3)
res[i++] = (t >> (30 - j) & 0x7) + '0';
res[i] = 0x00;
return res;
}
int main()
{
long a = -16;
printf("%s\n", decimal2octal(a));
return 0;
}