补码一位乘法

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;
}

猜你喜欢

转载自www.cnblogs.com/bingw/p/11800475.html