C语言实现原码一位乘

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

#include <stdio.h>
#include <string.h>
int main(){
	int temp,i;
	char A[100],Q[100],X[100];
	printf("输入被乘数X(如+1011):"); 
	scanf("%s",&X);
	printf("\n输入乘数X(如-1101):"); 
	scanf("%s",&Q);
	// printf("符号异或:");
	if(X[0]==Q[0]){
		temp='0';
	}else if(X[0]!=Q[0]){
		temp='1';
	}
	
	X[0]='0';Q[0]='0';
	// printf("\n");
	// printf("\t部分积A  \t乘数Q   \t\t说明\n");
	for(i=0;i<strlen(X)-1;i++){
		A[i]='0';
	}	
	// printf("\t%s", A);
	for(i=2;i<strlen(Q);i++) {
	// printf("\t    ");
		if (Q[strlen(Q) - 1] == '1'){    // 乘数最低位是 1
			//打印每行的乘数 Q 
			for (int i = 1; i < strlen(Q); i++){
				// printf("%c",Q[i]);
			}
			// printf("\t\t部分积 ->1 ,乘数 -> 1,末位为1,+|X|"); 
			// printf("\n");
			// printf("+|X|\t");
			X[1]='0';
			// for (int j = 1; j < strlen(X); j++){		
			// 	printf("%c",X[j]);
			// }
			// printf("\n------------------------------\n");
			int CarryBit=0; 
			//printf("\n%d,%d,%s,%s\n",strlen(A),strlen(X),A,X);
			for (int i = strlen(A) - 1; i >= 0; i--){
				A[i] = (A[i] - '0') + (X[i+1] - '0') + CarryBit;
				if (A[i] >= 2){
					CarryBit = 1;		//逢二进一 
					A[i] -= 2;			//每一位进位后加出的值 
				}
				else{
					CarryBit = 0;
				}
				A[i] += '0';
			}
			// printf("\t%s",A);
			// printf("\n");
			
			for (int j = strlen(Q) - 1; j >= 1; j--){		//乘数右移
				Q[j] = Q[j - 1];
			}	
			Q[1] = A[strlen(A) - 1];
					
			for (int j = strlen(A) - 1; j >= 0; j--){		//部分积右移
				A[j] = A[j - 1];
			}
			A[0] = '0';		//部分积右移后高位添0 
	
			// printf("\t%s",A);
			//printf("\t%s",Q);
			//printf("\n%s,%s,%s\n\t",X,Q,A);
		}else if(Q[strlen(Q) - 1] == '0'){
			// for (int i = 1; i < strlen(Q); i++){
			// 	printf("%c",Q[i]);
			// }
			// printf("\t\t部分积 -> 1 ,乘数 -> 1,末位为0,+0"); 
			// printf("\n");
			// printf("+0\t");
			X[1]='0';
			// for (int j = 0; j < strlen(X)-1; j++){
			// 	printf("0");
			// }	
			// printf("\n------------------------------\n");
	
			// printf("\t%s",A);
			// printf("\n");
			
			for (int j = strlen(Q) - 1; j >= 1; j--){		//乘数右移
				Q[j] = Q[j - 1];
			}	
			Q[1] = A[strlen(A) - 1];
					
			for (int j = strlen(A) - 1; j >= 0; j--){		//部分积右移
				A[j] = A[j - 1];
			}
			A[0] = '0';		//部分积右移后高位添0 
			// printf("\t%s",A);
		}
	}
	// printf("\t    ");
	for (int i = 1; i <strlen(Q); i++){
		// printf("%c",Q[i]);	
	}
	
	for (int i = 0; i <strlen(Q)-1; i++){
		Q[i]=Q[i+1];	
	}
	Q[strlen(Q)-2] = '\0';
	//printf("\nX=%s---Q=%s---A=%s\n",X,Q,A);
	for(i = strlen(A)-1;i>=0;i--){
		A[i+1]=A[i];
	}A[0]='.';
    strcat(A,Q);
	// printf("\n\n得到除符号位结果:%s",strcat(A,Q));		//连接部分积 A和除去符号位的乘数 Q ;strcat用来连接字符串 
	// printf("\n");
	A[0]=temp;		//取结果符号位来覆盖掉原来的首位
	// printf("∵符号位为:'%c'\n∴[X·Y]原 = %s\n",A[0],A);		//输出相乘后二进制原码 
    printf("∴[X·Y]原 = %c.%s\n",A[0],A);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值