八进制转为二进制算法

八,十六,四进制转为二进制

算法思想如图所示:
八进制,十六进制,四进制,N进制(N是2的x次方)都可以用这个算法!我这里用八进制为例。
算法思想如图
这个算法主要有两点
1.把要转换的数拆分成单个的数存入数组1。
2.把单个的八进制数,转成3个二进制数存入数组2。
代码实现如下:

//fun的功能是将八进制转换为二进制
//算法思想,将八进制数拆成单个的八进制位数,然后将1个八进制位数,转换成3个二进制位数。
void fun1(int b)
{
	//数组e1存放被拆分好的八进制位数。
	//e1可以多申请点儿空间,以便存入较多的数据,转换较大的八进制数。
	int e1[1000];
	int i = 0;
	int a1;
	int b1 = b;
	//拆分数据,并且放入数组。(*注意这里把八进制的最高位,放到了数组的最后)
	for (; b1 != 0 ;)
	{
		a1 = b1%8;
		e1[i] = a1;
		b1 = b1/8;
		i++;
	}
	//i是数组e1最后一个元素的下标。
	i--;

	//数组t用来存放单个八进制数位转换的二进制位数。
	//(注意:数组e1最后的数据,被存放在了数组t的最前面。也就是说八进制的最高位被存放在了数组t的前面)
    int t[1000];
	int u = 0;
	int a2;
	int b2;
	//记录数组t的元素个数
	int num2 = 0;
	for (; i >= 0 ; i--)
	{	//注意把1个八进制位数得到的3个二进制位数倒着存放在数组t中
		
		u = u + 2;
		//内层循环:将一个八进制数位,转换成三个数位。
		for (int i1 = 0 ; i1 < 3 ; i1++)
		{
			a2 = e1[i]%2;
			t[u] = a2;
			u = u - 1;
			b2 = e1[i]/2;
			num2++;
		}
		//内层循环新起点
		u = u + 4;
	}
	// 数组t的最后一个元素的下标
	u = u - 1;

	//经过上面的处理,八进制位数转换成的二进制位数,已经被存放在了数组t内(t有num2个元素,最后一个元素下标为u)
	for (int i2 = 0 ; i2 < num2 ; i2++)
	{
		//循环打印数组元素,得到转换后的二进制数。
		cout<<t[i2];
	}
	cout<<endl;
}
### 实现方法 要将二进制换为八进制数,可以采用间接方式完成。具体来说,可以通过以下步骤实现: 1. 将二进制数读取并存储为字符串形式。 2. 遍历字符串中的每一位二进制数字,并将其按每三位一组分组(因为八进制的一位对应于二进制的三位)。 3. 对每一组进行计,得到对应的八进制数值。 以下是完整的代码示例以及解释: ```c #include <stdio.h> #include <string.h> void binaryToOctal(char *binaryStr) { int len = strlen(binaryStr); int octalNum = 0, powerOfTwo = 1; // 补齐长度使其能被三整除 while (len % 3 != 0) { static const char padding[] = "0"; strcat(padding, binaryStr); strcpy(binaryStr, padding); len++; } for (int i = len - 1; i >= 0; --i) { if (binaryStr[i] == '1') { octalNum += powerOfTwo; } powerOfTwo *= 2; // 每处理完三个比特就重置权重并将结果左移一位 if ((len - i) % 3 == 0) { printf("%d", octalNum); // 输出当前八进制位 octalNum = 0; powerOfTwo = 1; } } } int main() { char binaryStr[100]; printf("请输入一个二进制数:"); scanf("%s", binaryStr); printf("对应的八进制数为:"); binaryToOctal(binaryStr); printf("\n"); return 0; } ``` #### 解释 上述代码实现了从二进制八进制换过程[^1]。 - **补齐操作**:为了方便后续分组,如果输入的二进制串长度不是3的倍数,则在其前面补零直到满足条件。 - **逐位解析**:通过遍历字符串中的每一个字符,判断其是否为`'1'`,如果是则累加相应的权值。 - **分组逻辑**:每当处理完连续的三个二进制位后,将这些位所代表的十进制值作为八进制的一个有效位输出,并清空临时变量以便继续下一组的计。 此算法基于基本的数学原理——任意基数间的换都可以借助中间媒介(通常是十进制),或者直接按照定义展开求解[^4]。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值