C实现booth算法,定点小数补码一位乘法
#include <stdio.h> #include <string.h> #include<stdlib.h> #define N 10 char strA[N] = {1}; char strpB[N] = {0}; char strnB[N] = {0}; char strC[N] = {0}; char negate(char s){ if(s == '1') return '0'; else if(s == '0') return '1'; else return s; } void transformOne(char n[N]){ size_t len = strlen(n); char m[N] = {0}; for(int i=1;i<len-1;i++){ strpB[i] = n[i]; strnB[i] = negate(n[i]); } strpB[len-1] = strnB[len-1] = '1'; //最后一位必为1 if(n[0] == '+'){ strpB[0] = '0'; strnB[0] = '1'; } else{ strpB[0] = '1'; strnB[0] = '0'; for(int i=1;i<len;i++){ m[i] = strpB[i]; strpB[i] = strnB[i]; strnB[i] = m[i]; } } strA[0] = strA[1] = '0'; strA[2] = '.'; for(int i=3;i<len;i++) strA[i] = '0'; } void transformTwo(char n[N]){ size_t len = strlen(n); if(n[0] == '-'){ strC[0] = strC[len-2] = '1'; //最后一位必为1 for(int i=1;i<len-2;i++){ strC[i] = negate(n[i+1]); } } else //正数的补码等于本身 for(int i=0;i<len-1;i++) strC[i] = n[i+1]; } void oneComplementMultiplication(){ char sign[2] = {0}; char carry[2] = {'0','0'}; size_t lenA = strlen(strA); size_t lenC = strlen(strC); size_t step = lenC-2; strC[lenC] = '0'; //拿去字符'.' for(int i=2;i<N;i++) strA[i] = strA[i+1]; for(int i=2;i<N;i++){ strpB[i] = strpB[i+1]; strnB[i] = strnB[i+1]; } for(int i=1;i<N;i++) strC[i] = strC[i+1]; lenA--; for(int i=0;i<step+1;i++){ sign[0] = strC[lenC-1]; sign[1] = strC[lenC-2]; carry[0] = carry[1] = '0'; for(long i=lenA-1;i>=0;i--){ carry[0] = carry[1]; if(sign[0] < sign[1]) strA[i] = (char)(strnB[i]+strA[i]-48); //转换数字求和-结果转换字符 else if(sign[0] > sign[1]) strA[i] = (char)(strpB[i]+strA[i]-48); else break; if((strA[i]+carry[0]-48) <= '1'){ strA[i] = (char)(strA[i]+carry[0]-48); carry[1] = '0'; } else if ((strA[i] == '1') && (carry[0] == '1')){ strA[i] = '0'; carry[1] = '1'; } else if((strA[i] == '2') && (carry[0] == '0')){ strA[i] = '0'; carry[1] = '1'; } else{ strA[i] = '1'; carry[1] = '1'; } } if(i < step){ for(long i=lenC-1;i>0;i--) strC[i] = strC[i-1]; strC[0] = strA[lenA-1]; for(long i=lenA-1;i>0;i--) strA[i] = strA[i-1]; strA[0] = strA[1]; } } for(long i=lenA;i<lenA+step;i++) strA[i] = strC[i-lenA]; } int judgment(char n[],long m){ if((n[0]=='+') || (n[0]=='-')) if(n[1] == '0') if(n[2] == '.') if(n[m-1] == '1'){ for(int i=3;i<m-1;i++) if((n[i] != '0') && (n[i] != '1')) return 1; return 0;} return 1;} int main(int argc, const char * argv[]) { // insert code here... //char X[N] = "-0.1101"; //char Y[N] = "-0.1011"; char X[N] = {0}; char Y[N] = {0}; size_t lenX = 0; size_t lenY = 0; int boolX = 0; int boolY = 0; do{ printf("input:"); scanf("%s%s",X,Y); lenX = strlen(X); lenY = strlen(Y); boolX = judgment(X,lenX); boolY = judgment(Y,lenY); }while(boolX | boolY); //全为0退出循环 transformOne(X); transformTwo(Y); oneComplementMultiplication(); strA[1] = '.'; for(int i=0;i<lenX+3;i++){ printf("%c",strA[i]); } printf("\n"); return 0; }