格雷码和二进制码的互相转换

今天数字逻辑的老师竟然要求我们下来用代码实现格雷码和二进制码的互相转换,还要发到他的邮箱里= =,真是有够闲的

代码如下:

#include<stdio.h>
#define maxsize 1000

char my_xor (char a, char b) //异或运算
{
	if ((a != '1' && a != '0') || (b != '1' && b != '0'))
	{
		printf("二进制码错误!\n");
		exit(0);
	}
	if (a != b)
		return '1';
	return '0';
}

void b2g()//二进制码转换为格雷码
{
	char b[maxsize] = { ' ' };//表达二进制码,由1和0组成。
	int n = 0;//数组的大小
	printf("请输入二进制码的长度n:");
	scanf("%d", &n);
	getchar();
	printf("请输入要转换的二进制码:");
	for (int i = 0; i < n; i++) {
		scanf("%c", &b[i]);
	}
	//检查二进制码:
	//	printf("%s", b);

	char G[maxsize] = { ' ' };//创建格雷码数组
	G[0] = b[0];
	for (int i = 1; i < n; i++) {
		G[i] = my_xor(b[i - 1], b[i]);
	}
	printf("转换出的典型格雷码是:%s\n", G);
}

char opposite_xor(char b, char g) //由b[i-1]和G[i]判断b[i]并返回b[i]
{
	if ((g != '1' && g != '0') || (b != '1' && b != '0'))
	{
		printf("二进制码错误!\n");
		exit(0);
	}
	if (g == '1')
	{
		if (b == '1')
			return '0';
		else
		return '1';
	}
	else if (g == '0')
	{
		if (b == '1')
			return '1';
		else 
		return '0';
	}
	return '0';
}
void g2b()//格雷码转二进制码
{
	char b[maxsize] = { ' ' };//表达二进制码,由1和0组成。
	char G[maxsize] = { ' ' };//创建格雷码数组

	int n = 0;//数组的大小
	printf("请输入格雷码的长度n:");
	scanf("%d", &n);
	getchar();
	printf("请输入要转换的格雷码:");
	for (int i = 0; i < n; i++) {
		scanf("%c", &G[i]);
	}
	//检查二进制码:
	//	printf("%s", b);


	b[0] = G[0];
	for (int i = 1; i < n; i++) {
		b[i] = opposite_xor(b[i-1], G[i]);
	}
	printf("转换出的二进制码是:%s", b);
}
int main()
{
	b2g();//二进制码转换为格雷码
	g2b();//格雷码转换为二进制码
	return 0;
}

//b2g测试案列
/*
输入:
4
0001
输出:
0001

输入:
4
0101
输出:
0111

输入:
4
1010
输出:
1111

*/

//g2b测试案列
/*
输入:
4
0001
输出:
0001

输入:
4
0111
输出:
0101

输入:
4
1111
输出:
1010

*/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值