C语言实现原码一位除

具体代码如下,直接运行即可。

#include <stdio.h>
int main()
{
	int i, a = 0, b = 0, c = 0, flag = 3; // flag相当于指针来指明Q的位置
	char x[6], y[6];
	int R[6], Q[6], yb[6], y1[6]; // yb是-y的补码,y1为绝对值y
	printf("请输入X(带一位符号位四位数值位的二进制数,如+1011):");
	scanf("%5s", x); 
	while ((c = getchar()) != '\n' && c != EOF); // 清除缓冲区中的剩余字符
	printf("请输入Y(带一位符号位四位数值位的二进制数,如-1101):");
	scanf("%5s", y); 
	// printf("X=%s\n",x);
	// printf("Y=%s\n",y);
	y1[0] = 0; // 绝对值y一定是正的,符号位为0
	for (i = 4; i >= 1; i--)
	{
		if (y[i] == '1')
		{ // 将字符型的y变成int型的绝对值y
			y1[i] = 1;
		}
		else
			y1[i] = 0;
	}
	// printf("y的绝对值y1:");
	// for (i = 0; i <= 4; i++)
	// {
	// 	printf("%d", y1[i]);
	// }
	// printf("\n");

	if (x[0] == '+')
	{
		a = 0;
		x[0] = '0'; // 符号位计算
	}
	else // 这里我怀疑是有点问题,先加个大括号先,出问题再删
	{	a = 1;
		x[0] = '1';
	}
	if (y[0] == '+')
	{
		b = 0;
		y[0] = '0';
	}
	else // 这里我怀疑是有点问题,先加个大括号先,出问题再删
	{	b = 1;
		y[0] = '1';
	}
	if (a + b == 1) //只有一个1一个0,异号的时候才结果为负
	{
		c = 1;
	}
	else
		c = 0; // c为符号位

	yb[0] = 1;
	for (i = 4; i >= 0; i--)
	{ //-y的补码计算
		if (y1[i] == 1) //!!!我这里把y改成了y1
			yb[i] = 0; // 取反
            //我这里不取反试试
            // yb[i] = 1;
		else
			yb[i] = 1;
            //我这里不取反试试
            // yb[i] =0;
	}
	// printf("y1取反后的值:");
	// for (i = 0; i <= 4; i++)
	// {
	// 	printf("%d", yb[i]);
	// }
	// printf("\n");

	yb[4] = yb[4] + 1; // 末尾加一
	for (i = 4; i > 0; i--)
	{
		if (yb[i] == 2)
		{ // 满2进一位
			yb[i] = 0;
			yb[i - 1] += 1;
		}
		if (yb[i] == 3)
		{ // 满3进一位 且留下1
			yb[i] = 1;
			yb[i - 1] += 1;
		}
	}

	// printf("-y1的补码yb为:");
	// for (i = 0; i <= 4; i++)
	// {
	// 	printf("%d", yb[i]);
	// }
	// printf("\n");

	for (i = 4; i >= 0; i--)
	{
		Q[i] = 0; // 给Q赋初值
	}

	R[0] = 0; // 设置余数
	for (i = 4; i >= 1; i--)
	{ // 给R做初始化
		if (x[i] == '1')
			R[i] = 1;
		else
			R[i] = 0;
	}

	// printf("R的初始值:"); // 余数符号位为0 数值位为x的值
	// for (i = 0; i <= 4; i++)
	// {
	// 	printf("%d", R[i]);
	// }
	// printf("\n");

	while (flag >= 1)
	{ // 当flag=1时相当于全部除完

		if (flag == 1)
		{ // 最后一步不移位  单独提出来
			for (i = 4; i >= 0; i--)
			{ // 余数R加上-y的补码
				R[i] += yb[i];
				if (R[i] == 2)
				{ // 满2进一位
					R[i] = 0;
					R[i - 1] += 1;
				}
				if (R[i] == 3)
				{ // 满3进一位 且留下1
					R[i] = 1;
					R[i - 1] += 1;
				}
			}
			if (R[0] == 1)
			{ // 若符号位为1 说明不够减 再加y恢复余数,不够减Q=0
				Q[4] = 0;
			}
			else
				Q[4] = 1;

			break;
		}
		for (i = 4; i >= 0; i--)
		{ // 余数R加上-y的补码
			R[i] += yb[i];
			if (R[i] == 2)
			{ // 满2进一位
				R[i] = 0;
				R[i - 1] += 1;
			}
			if (R[i] == 3)
			{ // 满3进一位 且留下1
				R[i] = 1;
				R[i - 1] += 1;
			}
		}

		if (R[0] == 1)
		{ // 若符号位为1 说明不够减 再加y恢复余数,不够减Q=0
			Q[4] = 0;
			flag -= 1; // 向左移动一位
			for (i = 4; i >= 1; i--)
			{
				R[i] += y1[i];
				if (R[i] == 2)
				{ // 满2进一位
					R[i] = 0;
					R[i - 1] += 1;
				}
				if (R[i] == 3)
				{ // 满3进一位 且留下1
					R[i] = 1;
					R[i - 1] += 1;
				}
			} // 不够减先恢复余数再左移
			for (i = 0; i <= 3; i++)
			{ // 左移
				R[i] = R[i + 1];
			}
            //!!! 这里应该是逻辑左移的,所以我重新设为0
			// R[4] = Q[0]; // 将Q的第一个移动给R
            R[4] = 0 ;
			for (i = 0; i <= 3; i++)
			{ // 左移
				Q[i] = Q[i + 1];
			}
		} // 恢复后R[0]符号位又变成了0

		else
		{			   // 够减直接左移
			Q[4] = 1;  // 够减Q为1
			flag -= 1; // 向左移动一位
			for (i = 0; i <= 3; i++)
			{ // 左移
				R[i] = R[i + 1];
			}
            //!!! 还是逻辑左移设为0
			// R[4] = Q[0]; // 将Q的第一个移动给R
            R[4] = 0;

			for (i = 0; i <= 3; i++)
			{ // 左移
				Q[i] = Q[i + 1];
			}
		}
	}
	printf("商Q的值:");
	for (i = 0; i <= 4; i++)
	{
		printf("%d", Q[i]);
	}
	printf("\n");

	printf("余数R的值:0.000");
	for (i = 0; i <= 4; i++)
	{
		printf("%d", R[i]);
	}
	printf("\n");

	printf("X/Y=%d.", c);
	for (i = 1; i <= 4; i++)
	{
		printf("%d", Q[i]);
	}
	printf("\n");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中可以使用位运算符来实现原码、反码、补码和移码之间的转换。下面是一些常用的转换方法: 1. 原码转反码:将原码的符号位不变,其余位取反,即符号位为1时,其余位取反;符号位为0时,不变。 2. 反码转原码:将反码的符号位不变,其余位取反,即符号位为1时,其余位取反;符号位为0时,不变。 3. 原码转补码:将原码的符号位不变,其余位取反后加1,即符号位为1时,其余位取反后加1;符号位为0时,不变。 4. 补码转原码:将补码的符号位不变,其余位取反后加1,即符号位为1时,其余位取反后加1;符号位为0时,不变。 5. 原码转移码:将原码的符号位不变,其余位加上一个固定的数值,即符号位为1时,其余位加上127;符号位为0时,其余位加上128。 6. 移码转原码:将移码的符号位不变,其余位减去一个固定的数值,即符号位为1时,其余位减去127;符号位为0时,其余位减去128。 下面是一些示例代码: 1. 原码转反码: ```c int originalToComplement(int num) { int mask = num < 0 ? 0x7fffffff : 0xffffffff; return (num ^ mask); } ``` 2. 反码转原码: ```c int complementToOriginal(int num) { int mask = num < 0 ? 0x80000000 : 0x00000000; return (num ^ mask); } ``` 3. 原码转补码: ```c int originalToTwosComplement(int num) { return (~num + 1); } ``` 4. 补码转原码: ```c int twosComplementToOriginal(int num) { return (~num + 1); } ``` 5. 原码转移码: ```c int originalToOffset(int num) { return (num + 127); } ``` 6. 移码转原码: ```c int offsetToOriginal(int num) { return (num - 127); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值