2010年8月12日 星期四

Booth Algorithm

Booth on-line test Booth's Algorithm sample code booth.cpp

#include <iostream>
#include <string>


#define BITSIZE 5 

using namespace std;

class Booth{
private:
 int a;
 string a_str;
 int b;
 string b_str;
 int c;
 string c_str;
 int bit;
public :
int CheckRange(int a){int i=( -32768<=a && a<=32767 )? 0:-1; return i; }

void SetBooth_a(int i){ a=i;      }
int GetBooth_a(){      return a; }

void SetBooth_a_str(int a){ a_str = Int2Bin(a); }
string  GetBooth_a_str(){      return a_str;       }

void SetBooth_b(int i){ b=i;      }
int GetBooth_b(){      return b; }

void SetBooth_b_str(int b){ b_str = Int2Bin(b); }
string  GetBooth_b_str(){      return b_str;       }

void SetBooth_c(int i){ c=i;      }
int GetBooth_c(){      return c; }

void SetBooth_c_str(int c,int b){ c_str = Int2Bin(c)+Int2Bin(b); }
string GetBooth_c_str(){      return c_str;       }

int SetBooth_Bit(int b){ bit=b; }

string GetBegin_str(string s){ string::iterator it;
                                string t;
                                it = s.begin();
                                t = *it;
                                return t;
                              }

string GetEnd_str(string s){ string::iterator it; 
          string t;
                               it = s.end()-1;
                               t = *it;
                               return t;
                             }

string Int2Bin(int number)
{
    string bins;
    int mask = 0x01;

    bins.resize(BITSIZE);

    for( int i = 0; i < BITSIZE; i++ )
         bins[BITSIZE-1-i] = ((number >> i) & mask )? '1' : '0';

    return bins;
}

void Pro_SHIFT_c_str(){
     string::iterator it;
     string str;
 
       str += *c_str.begin();
     for(it= c_str.begin(); it<c_str.end()-1; it++){
       str += *it; 
    }

     c_str=str;
     c = c >>1;
}

void Pro_ADD_A_c_str(){
   int r = c = c + a; 
   string  r_str = Int2Bin(r);

   string::iterator it;
   string s_str;
   for( it=c_str.begin()+BITSIZE; it<c_str.end(); it++ ){ 
        s_str += *it;
   }
   r_str += s_str;
   c_str = r_str;
}

void Pro_SUB_A_c_str(){
   int r = c = c -a; 
   string  r_str = Int2Bin(r);

   string::iterator it;
   string s_str;
   for( it=c_str.begin()+BITSIZE; it<c_str.end(); it++ ){ 
        s_str += *it;
   }
   r_str += s_str;
   c_str = r_str;
}

};



int main(int argc,char *argv[]){

Booth *BoothPtr = new Booth;

int a =2;
int b =-5;

if( BoothPtr->CheckRange(a) != 0 ){ 

cout<<"Out of Data Range in '-2^15 ~ 2^15-1' @a"<<endl;
return -1;
}
BoothPtr->SetBooth_a(a);
BoothPtr->SetBooth_a_str(a);


if( BoothPtr->CheckRange(b) != 0 ){ 
cout<<"Out of Data Range in '-2^15 ~ 2^15-1' @b"<<endl;
return -1;
}

BoothPtr->SetBooth_b(b);
BoothPtr->SetBooth_b_str(b);

BoothPtr->SetBooth_c(0);
BoothPtr->SetBooth_c_str(0,b);

string b_str = BoothPtr->GetBegin_str( BoothPtr->GetBooth_a_str() );

cout << "============================================"<<endl;
cout << "Step0.\tInitial a,b..." <<endl;  
cout << " a::\t" << BoothPtr->GetBooth_a() <<"\t"<< BoothPtr->GetBooth_a_str()<<endl;
cout << "xb::\t" << BoothPtr->GetBooth_b() <<"\t"<< BoothPtr->GetBooth_b_str()<<endl;
cout << "--------------------------------------------"<<endl;
cout << " c::\t" << BoothPtr->GetBooth_c_str() <<" "<< b_str<<endl;
cout << "============================================"<<endl;
cout << endl;

string r_str;

//cout << BoothPtr->Pro_SHIFT_c_str("1101");

for(int i=0; i<BITSIZE; i++){
      
      r_str = BoothPtr->GetEnd_str( BoothPtr->GetBooth_c_str() );  
      r_str += b_str;

          b_str = BoothPtr->GetEnd_str( BoothPtr->GetBooth_c_str() );

         if( r_str == "00" ){ cout << "Step"<< i+1 <<".\tSHIFT"<<endl; BoothPtr->Pro_SHIFT_c_str();                           }
    else if( r_str == "01" ){ cout << "Step"<< i+1 <<".\tADD_A"<<endl; BoothPtr->Pro_ADD_A_c_str();  BoothPtr->Pro_SHIFT_c_str(); } 
    else if( r_str == "10" ){ cout << "Step"<< i+1 <<".\tSUB_A"<<endl; BoothPtr->Pro_SUB_A_c_str();  BoothPtr->Pro_SHIFT_c_str(); }
    else if( r_str == "11" ){ cout << "Step"<< i+1 <<".\tSHIFT"<<endl;BoothPtr->Pro_SHIFT_c_str();                               }
    else{ cout <<" Booth Internal Error ..." << endl; return -1; } 
   
cout << " a::\t" << BoothPtr->GetBooth_a() <<"\t"<< BoothPtr->GetBooth_a_str()<<endl;
cout << " b::\t" << BoothPtr->GetBooth_b() <<"\t"<< BoothPtr->GetBooth_b_str()<<endl;
cout << " c::\t" << BoothPtr->GetBooth_c() <<"\t"<< BoothPtr->GetBooth_c_str()<<endl; 
cout << "--------------------------------------------"<<endl;
cout << " c::\t" << BoothPtr->GetBooth_c_str() <<" "<< b_str<<endl;
cout << "============================================"<<endl;
cout << endl;


}

cout << " c::\t" << "Bin::"<<BoothPtr->GetBooth_c_str() <<" "<< "Dec::"<<a*b<<endl;

return 0;
}
Results: ============================================ Step0. Initial a,b... a:: 2 00010 xb:: -5 11011 -------------------------------------------- c:: 0000011011 0 ============================================ Step1. SUB_A a:: 2 00010 b:: -5 11011 c:: -1 1111101101 -------------------------------------------- c:: 1111101101 1 ============================================ .... ============================================ Step5. SHIFT a:: 2 00010 b:: -5 11011 c:: -1 1111110110 -------------------------------------------- c:: 1111110110 1 ============================================ c:: Bin::1111110110 Dec::-10 code download here

沒有留言:

張貼留言