十六进制转八进制
十六进制转八进制的一个方法是先将十六进制数转化为二进制数,再将二进制数转为八进制。我在这里转换时用到堆栈的方法,即每个十六进制数转为四个二进制数,在此之前我先计算十六进制数的个数,在知道个数的基础之上在二进制数前面增加n个零,以确保转二进制的个数满足对3求余等于零。每当取得四个二进制数,就把这些数依次加入二进制堆栈里面,同时,当满足堆栈有三个元素的 时候,就把二进制栈中的元素出栈转化为八进制数并输出。
#include <iostream>
using namespace std;
#include <string.h>
#define MAX 4
int octalNum = 0;
struct Stack
{//二进制堆栈
Stack() : top(-1)
{
int i = 0;
while(i < MAX){*(s + i++) = 0;}//初始化
}
int s[MAX];
int top;//起始位置为-1
};
bool push(struct Stack* s, int val)
{//入栈
if(s->top >= MAX)
return false;
else
s->s[++s->top] = val;
return true;
}
bool pop(struct Stack* s, int* val)
{//出栈
if(s -> top < 0)
return false;
else
{
*val = s->s[s->top];
s->s[s->top--] = 0;
}
return true;
}
void del_stack(struct Stack* s)
{//删除栈中元素
int temp;
while(pop(s, &temp))
;
}
struct Stack binaryStack;//全局变量,存放二进制栈
void binary_octal()
{//二进制数转化为八进制数
int resu = 0, val = 0, m = 1;
while(pop(&binaryStack, &val))
{//不断地出栈,将取出的值按该位置权进行赋值
resu += val * m;
m = m << 1;//每取出一个值向左移一位
}
if(octalNum == 0 && resu == 0)
{//当第一个数为0时不输出
octalNum++;
return;
}
cout << resu;//输出八进制的结果
octalNum++;
}
void six_binary(char* s)
{//十六进制转化为二进制
int nSize = strlen(s);//十六进制长度
int size = nSize;//用于在前面增加零
int binary[4] = {0};//取四位二进制数
int* temp = new int[nSize];//十六进制字符依次转化为二进制整数
int i = 0;
while(*(s + i) != '\0')
{
*(temp + i) = *(s + i) - '0' > 9 ?
*(s + i) - '0' - 7 : *(s + i) - '0';
i++;
}
while(size++ % 3 != 0)//增加额外的零
push(&binaryStack, 0);
for(i = 0; i < nSize; i++)
{
int j = 0;
while((++j % 5))
{//每个十六进制数转为四个二进制数
binary[j - 1] = *(temp + i) % 2;
*(temp + i) = *(temp + i) / 2;
}
for(j = 0; j < 4; j++)
{//将四个二进制数依次加入二进制堆栈,当满足栈元素为3的时候进行对八进制的转换
push(&binaryStack, binary[3 - j]);
if(binaryStack.top == 2)
binary_octal();
}
}
delete temp;
}
void solve(char* s)
{
six_binary(s);
}