十六进制转八进制

本文介绍了一种通过中间转换成二进制的方式实现十六进制到八进制的转换方法。具体步骤包括:首先将十六进制数转换为二进制数,然后将得到的二进制数转换为八进制数。文章提供了一个使用堆栈结构来辅助转换过程的示例程序。

十六进制转八进制

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


 

### C++ 十六进制八进制 示例代码 以下是将十六进制换为八进制的完整 C++ 示例代码,该代码通过先将十六进制换为十进制,再从十进制换为八进制来实现[^1]。 ```cpp #include <iostream> #include <string> using namespace std; // 将十六进制字符串换为十进制整 long long hexToDecimal(const string& hex) { long long decimal = 0; int power = 0; for (int i = hex.size() - 1; i >= 0; --i) { char c = hex[i]; int value = 0; if (c >= '0' && c <= '9') { value = c - '0'; } else if (c >= 'A' && c <= 'F') { value = 10 + (c - 'A'); } else if (c >= 'a' && c <= 'f') { value = 10 + (c - 'a'); } decimal += value * pow(16, power); ++power; } return decimal; } // 将十进制整换为八进制字符串 string decimalToOctal(long long decimal) { if (decimal == 0) return "0"; string octal = ""; while (decimal > 0) { octal = to_string(decimal % 8) + octal; decimal /= 8; } return octal; } int main() { string hex; cout << "请输入一个十六进制: "; cin >> hex; // 换为大写以统一处理 for (char& c : hex) { if (c >= 'a' && c <= 'f') { c = c - 'a' + 'A'; } } long long decimal = hexToDecimal(hex); // 十六进制十进制 string octal = decimalToOctal(decimal); // 十进制八进制 cout << "十六进制: " << hex << endl; cout << "十进制: " << decimal << endl; cout << "八进制: " << octal << endl; return 0; } ``` 上述代码首先定义了两个函:`hexToDecimal` 和 `decimalToOctal`。前者用于将十六进制字符串换为十进制整,后者则用于将十进制整换为八进制字符串[^3]。主函中读取用户输入的十六进制,并调用这两个函完成换。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值