把二进制数转换为十进制、八进制和十六进制

这里提供两种方法,第一种是直接把二进制数转换为十进制、八进制和十六进制;第二种是先把二进制数转换为十进制数,再把十进制数转换为八进制和十六进制。

方法一:

#include<stdio.h>
void input(char binary[]) {//输入二进制数
	puts("Input a binary number:");
	char e; int i = -1;
	scanf("%c", &e);
	while (e == '0' || e == '1') {
		binary[++i] = e;
		scanf("%c", &e);
	}
}
void swap(char &c1, char &c2) {//交换两个char型变量
	char temp;
	temp = c1;
	c1 = c2;
	c2 = temp;
}
void invert(char binary[]) {//由于二进制数是按顺序输入的,因此将其转置从而使二进制权重按下标递增,方便后续计算
	int num = 0, i = 0,j;
	while (binary[i++])num++;
	i = 0; j=num - 1;
	while (i < j)
		swap(binary[i++], binary[j--]);
}
void bi_to_dec(char binary[], int& dec) {//将二进制数转换为十进制数
	int i = 0;
	int t = 1;
	while (binary[i]) {
		dec += (binary[i] - '0') * t;//位乘权再求和
		t *= 2;//每位的权
		i++;
	}
}
void bi_to_oct(char binary[], int& oct) {//将二进制数转换为八进制数
	int i = 0, t = 1;
	int item;
	while (binary[i + 2]) {
		item = (binary[i] - '0') * 1 + (binary[i + 1] - '0') * 2 + (binary[i + 2] - '0') * 4;//三位二进制位并做一位八进制位
		oct += item * t;
		t *= 10;//将结果化为十进制整数,这样方便存储和输出
		i += 3;
	}
	//处理二进制位数不是3的倍数的情况
	if (binary[i] && binary[i + 1])
		oct = ((binary[i] - '0') * 1 + (binary[i+1] - '0') * 2) * t  + oct;
	else
		if (binary[i])
			oct = (binary[i] - '0') * 1 * t + oct;
}
void bi_to_hex(char binary[], int hex[]) {//将二进制数组转换为十六进制数组
	//十六进制似乎难以用某个数存储,因此这里使用一个int型数组存储每个16进制位
	int i = 0, j = 0, t = 1;
	while (binary[i + 3]) {
		hex[j++] = (binary[i] - '0') * 1 + (binary[i + 1] - '0') * 2 + (binary[i + 2] - '0') * 4 + (binary[i + 3] - '0') * 8;
		//四位二进制位并做一位十六进制位
		i += 4;
	}
	//处理二进制位数不是4的倍数的情况
	if (binary[i] && binary[i + 1] && binary[i + 2])
		hex[j++] = (binary[i] - '0') * 1 + (binary[i + 1] - '0') * 2 + (binary[i + 2] - '0') * 4;
	else
		if (binary[i] && binary[i + 1])
			hex[j++] = (binary[i] - '0') * 1 + (binary[i + 1] - '0') * 2;
		else
			if (binary[i])
				hex[j++] = (binary[i] - '0') * 1;
}
int main() {
	char binary[32] = { 0 };
	input(binary);
	invert(binary);
	int dec = 0;
	bi_to_dec(binary, dec);
	printf("The number is %d in decimal.\n", dec);
	int oct=0;
	bi_to_oct(binary, oct);
	printf("The number is %d in octal.\n", oct);
	int hex[8] = { 0 };
	bi_to_hex(binary, hex);
	int i = 8;
	while (hex[--i]==0);
	printf("The number is ");
	while (i >= 0) {
		if (hex[i] >=10)
			printf("%c", hex[i] + 55);
		else
			printf("%d", hex[i]);
		i--;
	}
	printf(" in hexadecimal.\n");
	return 0;
}

 方法二:

#include<stdio.h>
int main() {
	char binary[32];
	puts("Input a binary number:");
	char e;int i = -1;
	scanf("%c", &e);
	while (e =='0' || e == '1') {
		binary[++i] = e;
		scanf("%c", &e);
	}//输入二进制数
	int dec=0;
	int t = 1;
	while (i >= 0) {
		dec += (binary[i]-'0') * t;
		t *= 2;
		i--;
	}//2转10
	printf("The number is %d in decimal.\n", dec);
	int oct = 0;
	int temp = dec;
	t = 1;
	while (temp) {
		oct += temp % 8 * t;
		temp/= 8;
		t *= 10;
	}//10转8
	printf("The number is %d in octal.\n", oct);
	temp = dec;
	int hex[8];
	i = -1;
	while (temp) {
		hex[++i] = temp % 16;
		temp /= 16;
	}
	printf("The number is ");
	while (i >= 0) {
		if (hex[i] >= 10)
			printf("%c", hex[i] + 55);
		else
			printf("%d", hex[i]);
		i--;
	}//输出16进制数
	printf(" in hexadecimal.\n");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵喵不同意

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值