2's complement division c++ program

11
//C++ Code to perform 2’s Complement Division //Code written by Ajitabh Gupta #include<iostream> #include<cmath> using namespace std; void dectobin(int*,int); int bintodec(int*,int); int n; int main() { int a,b,sc,ssor,send,s1,c,sum,allz,rem,quo; char ch; start: cout<<"Enter dividend in decimal format\n"; cin>>a; cout<<"Enter divisor in decimal format\n"; cin>>b; if(a!=0 && b==0) cout<<"Infinity\n"; //Handling Divide-by-Zero Exception else if(a==0 && b==0) cout<<"Undeterminate\n"; //Handling case when both dividend and divisor are zero else { if(a<0 && b<0)

Upload: ajitabh-gupta

Post on 29-Oct-2014

517 views

Category:

Documents


6 download

DESCRIPTION

C++ Code to perform 2's Complement Division by inputting numbers in decimal format and displaying the working of the algorithm along with quotient and remainder of the division.

TRANSCRIPT

Page 1: 2's Complement Division C++ Program

//C++ Code to perform 2’s Complement Division

//Code written by Ajitabh Gupta

#include<iostream>

#include<cmath>

using namespace std;

void dectobin(int*,int);

int bintodec(int*,int);

int n;

int main()

{

int a,b,sc,ssor,send,s1,c,sum,allz,rem,quo;

char ch;

start:

cout<<"Enter dividend in decimal format\n";

cin>>a;

cout<<"Enter divisor in decimal format\n";

cin>>b;

if(a!=0 && b==0)

cout<<"Infinity\n"; //Handling Divide-by-Zero Exception

else if(a==0 && b==0)

cout<<"Undeterminate\n"; //Handling case when both dividend

and divisor are zero

else

{

if(a<0 && b<0)

Page 2: 2's Complement Division C++ Program

{

a=abs(a);

b=abs(b);

cout<<"As both dividend and divisor are negative, -ve sign

cancels out\n";

}

if(a<0 && b>0)

{

a=abs(a);

b*=-1;

}

float td;

td=log((double)abs(a))/log(2.0);

n=(int)ceil(td+1); //Finding out the number of digits required to

store both dividend and divisor in binary format

cout<<"\nSC is "<<n<<endl;

sc=n;

int Q[n],A[n],M1[n],M2[n],pra[n],i;

dectobin(Q,a); //Converting the dividend into binary as Q

cout<<"\nQ is ";

for(i=0;i<=n-1;i++)

cout<<Q[i];

send=Q[0];

dectobin(M1,b); //Converting the divisor into binary as M1

cout<<"\nM is ";

Page 3: 2's Complement Division C++ Program

for(i=0;i<=n-1;i++)

cout<<M1[i];

ssor=M1[0];

for(i=n-1;i>=0;i--) //Taking the 2's Complement of M1 and

storing it as M2

{

if(M1[i]==0)

M2[i]=0;

else

break;

}

M2[i--]=1;

while(i>=0)

M2[i]=!M1[i--];

cout<<"\nM'+1 is ";

for(i=0;i<=n-1;i++)

cout<<M2[i];

int AQ[2*n]; //Creating a combined array of A and Q named AQ

for(i=0;i<n;i++)

AQ[i]=0;

for(i=n;i<2*n;i++)

AQ[i]=Q[i-n];

cout<<"\nInitial AQ : ";

for(i=0;i<=n-1;i++)

cout<<AQ[i];

Page 4: 2's Complement Division C++ Program

cout<<" ";

for(i=n;i<=2*n-1;i++)

cout<<AQ[i];

cout<<endl;

while(sc-->0) //Repeating the 2's Complement Division

Algorithm SC number of times

{

cout<<"\nAQ : "; //Displaying current AQ

for(i=0;i<=n-1;i++)

cout<<AQ[i];

cout<<" ";

for(i=n;i<=2*n-1;i++)

cout<<AQ[i];

cout<<" SC is "<<sc+1;

for(i=0;i<=(2*n-2);i++) //Shifting AQ Left by 1 bit

AQ[i]=AQ[i+1];

AQ[2*n-1]=0;

cout<<"\nShift Left "; //Displaying Left Shifted AQ

cout<<"AQ : ";

for(i=0;i<=n-1;i++)

cout<<AQ[i];

cout<<" ";

for(i=n;i<=2*n-1;i++)

cout<<AQ[i];

s1=AQ[0]; //Storing the original sign of A

Page 5: 2's Complement Division C++ Program

for(i=0;i<n;i++)

pra[i]=AQ[i]; //Storing the previous value of A to restore later if

required

if(AQ[0]==M1[0]) //Checking if A and M have the same sign

{

cout<<"\nAdd M'+1 ";

for(i=0;i<=n-1;i++)

cout<<M2[i];

c=0;

for(i=n-1;i>=0;i--)

{

sum=c+AQ[i]+M2[i]; //Adding 2's Complement of M to A

switch(sum)

{

case 0: {c=0;AQ[i]=0;break;}

case 1: {c=0;AQ[i]=1;break;}

case 2: {c=1;AQ[i]=0;break;}

case 3: {c=1;AQ[i]=1;break;}

default: {cout<<"\nError Encountered!";break;}

}

}

cout<<"\nAQ: "; //Displaying AQ after the addition

for(i=0;i<=n-1;i++)

cout<<AQ[i];

cout<<" ";

Page 6: 2's Complement Division C++ Program

for(i=n;i<=2*n-1;i++)

cout<<AQ[i];

}

else //Executed if A and M have different signs

{

cout<<"\nAdd M ";

for(i=0;i<=n-1;i++)

cout<<M1[i];

c=0;

for(i=n-1;i>=0;i--)

{

sum=c+AQ[i]+M1[i]; //Adding M to A

switch(sum)

{

case 0: {c=0;AQ[i]=0;break;}

case 1: {c=0;AQ[i]=1;break;}

case 2: {c=1;AQ[i]=0;break;}

case 3: {c=1;AQ[i]=1;break;}

default: {cout<<"\nError Encountered!";break;}

}

}

cout<<"\nAQ: "; //Displaying AQ after the addition

for(i=0;i<=n-1;i++)

cout<<AQ[i];

Page 7: 2's Complement Division C++ Program

cout<<" ";

for(i=n;i<=2*n-1;i++)

cout<<AQ[i];

}

allz=1; //Checking if A is equal to zero or not

for(i=n-1;i>=0;i--)

if(AQ[i]==1)

{

allz=0;

break;

}

if(s1==AQ[0] || allz==1) //Executed if sign of A is the same

before and after the operation OR if A is zero

{

AQ[2*n-1]=1; //Setting Q0 equal to 1

cout<<"\nSet Q0=1 \n";

}

if(s1!=AQ[0] && allz==0) //Executed if sign of A is different

before and after the operation AND A is non-zero

{

AQ[2*n-1]=0; //Setting Q0 equal to 0

cout<<"\nSet Q0=0 and Restore A \n";

for(i=0;i<n;i++) //Restoring the previous value of A

AQ[i]=pra[i];

}

Page 8: 2's Complement Division C++ Program

}

if(send!=ssor) //Checking if the sign of dividend is different

from the divisor's sign

{

for(i=2*n-1;i>=n;i--)

if(AQ[i]==1)

break;

i--;

while(i>=n)

AQ[i]=!AQ[i--];

}

for(i=0;i<n;i++)

{

A[i]=AQ[i];

Q[i]=AQ[i+n];

}

rem=bintodec(A,n); //Converting A from binary to decimal

format, A is the remainder after division

quo=bintodec(Q,n); //Converting Q from binary to decimal

format, Q is the quotient of the division

cout<<"\nQuotient is "<<quo<<" and Remainder is "<<rem;

//Displaying the Quotient and Remainder

}

cout<<"\nPress Y to perform another division or any other key

to exit!\n";

cin>>ch;

Page 9: 2's Complement Division C++ Program

if(ch=='Y' || ch=='y') //Asking the user if he wants to carry out

another division or exit the program

goto start;

return 0;

}

void dectobin(int *arr,int num) //Function to convert the passed

decimal number into binary and return the base address of the

binary array

{

int neg,i=0,j,temp;

if(num<0) //Checking for a negative number

{

neg=1;

num=abs(num);

}

while(num!=0) //Continuously dividing the number by 2 and

storing the remainder

{

*(arr+i++)=num%2;

num/=2;

}

for(j=i;j<=n-1;j++)

*(arr+j)=0;

for(i=0;i<=(n-1)/2;i++) //Reversing the binary array

{

temp=*(arr+i);

Page 10: 2's Complement Division C++ Program

*(arr+i)=*(arr+n-1-i);

*(arr+n-1-i)=temp;

}

if(neg==1)

{

*arr=1; //Setting sign bit to 1 in case of a negative number

for(i=n-1;i>=1;i--) //Taking 2's Complement to store the

negative number

if(*(arr+i)==1)

break;

i--;

while(i>=1)

*(arr+i)=!*(arr+i--);

}

}

int bintodec(int *p,int y) //Function to convert a binary array to

decimal by taking its base address as input and returning the

decimal equivalent

{

int sum=0,i;

if(*p==1) //Taking 2's Complement of the negative number to

get back its original magnitude

{

for(i=n-1;i>=1;i--)

if(*(p+i)==1)

break;

Page 11: 2's Complement Division C++ Program

i--;

while(i>=1)

*(p+i)=!*(p+i--);

}

for(i=1;i<=y-1;i++) //Repeatedly multiplying by increasing

powers of 2 and storing the sum after each iteration

sum+=((int)pow(2.0,y-1-i)*(*(p+i)));

if(*p==1)

sum*=-1;

return sum; //Returning the equivalent decimal of the passed

binary array

}