十六进制转八进制

十六进制转八进制

    十六进制转八进制的一个方法是先将十六进制数转化为二进制数,再将二进制数转为八进制。我在这里转换时用到堆栈的方法,即每个十六进制数转为四个二进制数,在此之前我先计算十六进制数的个数,在知道个数的基础之上在二进制数前面增加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);
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值