具体代码如下,直接运行即可。
#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);
}