0

I have included the program in which I am having a logical problem. The program is based on booth's algorithm and I have put a snippet of it. In this 'working' snippet decimal number is accepted from the user converted to decimal form with the help of array (a[0]=1 LSB) and lastly the 2s complement is calculated of array b[]. Now, when I run the program:

    #include<iostream>
    using namespace std;
    class booth
    {
    public:
    int n;
    int b[3];
    int comb[3], q[3];              //b=multiplicand q=multiplier
    int bb, qq;                     //bb and qq store actual decimal no.s    
    booth()
    {
        for(int i=0; i<4; i++)
        {
            b[i]=0;                 //b array stores multiplicand in binary
            q[i]=0;                 //q array stores multiplier in binary
            comb[i]=0;              //will store calculated 2s complement in      
                                      binary
        }
        n=4;
        bb=0;
        qq=0;
    }
void acceptMm();
void display();
};

void booth :: acceptMm()     //function to accept value from user and                     
                             //converting it into binary in the form of 
                             //array and then calculating its 2s complement
{
    cout<<"Enter Multiplicand: ";
    cin>>bb;
    cout<<"Enter Multiplier: ";
    cin>>qq;
    //decimal to binary
    int rem1, rem2, i=0, j=0; //rem1 and rem2 are remainders
    while(qq!=0)
    {
        rem2=qq%2;
        qq/=2;
        q[i]=rem2;
        i++;
    }
    cout<<q[3]<<q[2]<<q[1]<<q[0]<<endl;  // to display binary no.
    //again decimal to binary
    while(bb!=0)
    {
        rem1=bb%2;
        bb/=2;
        b[j]=rem1;
        j++;
    }
    cout<<b[3]<<b[2]<<b[1]<<b[0]<<endl;  //to display binary no.
    // 2s complement:
    int ii=0;
    int jj=4;    //4 bit binary number
        while(b[ii]==0 && jj!=0)
        {
            comb[ii]=b[ii];
            ii++;
            jj--;
        }
        comb[ii]=b[ii];
        cout<<b[3]<<b[2]<<b[1]<<b[0]<<endl;   //displayed value (problem)
        ii++;
        jj--;
        if(jj==0)
        {
            return;
        }
        while(jj!=0)
        {
        if(b[ii]==0)
        {
            comb[ii]=1;
            ii++;
            jj--;   }
        else
        {
            comb[ii]=0;
            ii++;
            jj--;
        }
        }
}

void booth :: display()
{
    cout<<"multiplicand\n";
    for(int x=3; x>=0; x--)
        {
            cout<<b[x]<<" ";
        }
    cout<<endl;
    cout<<"multiplier\n";
    for(int j=3; j>(-1); j--)
    {
        cout<<q[j]<<" ";
    }
    cout<<endl;
    cout<<"compliment of multiplicand\n";
    for(int y=3; y>(-1); y--)
    {
        cout<<comb[y]<<" ";
    }
}

int main()
{
booth obj;
cout<<"Booths Algorithm\n";
    obj.acceptMm();
    obj.display();
return 0;
}

Output

Booths Algorithm
Enter Multiplicand: 5
Enter Multiplier: 4
0100
0101
1101
multiplicand
1 1 0 1 
multiplier
0 1 0 0 
compliment of multiplicand
0 0 1 1 

Here in the output I expect the 6th line as 0101 but get 1101. Why are the values of array b[] changing? The value of array b[] at line 5 is correct so why does it change? According to the code the value shouldnt be changing right? I am stuck.. Please help!! Any suggestion will be appreciated!!

2 Answers 2

1

b, q and comb are array of 3 elements so b[3] is an array overflow (whose value is unknown). In fact comb being allocated right after b it is likely that b[3] equals comb[0].

Sign up to request clarification or add additional context in comments.

1 Comment

omg!! I cant believe I made such a mistake!! I was thinking that an array of b[0] b[1] b[2] b[3] will be formed.
0

You are doing an overflow . Do it like this. Simple .

class booth {
public:
    int n;
    int b[4];
    int comb[4], q[4];              //b=multiplicand q=multiplier
    int bb, qq;                     //bb and qq store actual decimal no.s
    booth() {
        for (int i = 0; i < 4; i++) {
            b[i] = 0;                 //b array stores multiplicand in binary
            q[i] = 0;                 //q array stores multiplier in binary
            comb[i] = 0;       //will store calculated 2s complement in        }
            n = 4;
            bb = 0;
            qq = 0;
        }
    }

2 Comments

make the loop count upto 5
I hope that helped.:D

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.