1 /******************************************************** 2 * gray.code.counter.cpp 3 * C++ Variable bit width Gray Counter. 4 * Prompts user for bit width; 5 * then outputs the Gray count sequence to the screen. 6 * Compiles on gnu g++ compiler with 7 * g++ gray.code.counter.cpp -o gray.code.counter.o -Wall 8 * Author: John Bryan, Jr. 9 * Date: August 22, 2006 10 *********************************************************/ 11 # include <iostream> 12 # include <math.h> 13 # define max (int)pow((double)2,(double)N) 14 using namespace std; 15 16 17 class GrayCounter 18 { 19 int N,*B,*G; 20 void printG(); 21 void BinaryToGray(); 22 void InitializeB(); 23 void QueryN(); 24 void Increment(); 25 public: 26 void Algorithm(); 27 }Gray; 28 29 30 void GrayCounter::printG() 31 { 32 int k; 33 cout << " "; 34 for (k=0;k<N;k++) 35 cout << G[k]; 36 cout << "\n"; 37 } 38 39 void GrayCounter::BinaryToGray() 40 { 41 G[0]=B[0]; 42 for (int j=1;j<N;j++) 43 G[j]=B[j]^B[j-1]; 44 printG(); 45 } 46 47 48 void GrayCounter::InitializeB() 49 { 50 for (int i=0;i<N;i++) 51 B[i]=0; 52 } 53 54 void GrayCounter::QueryN() 55 { 56 cout << "\nPlease enter the number of bits for the Gray code counter: "; 57 cin >> N; 58 B= new int[N]; 59 G= new int[N]; 60 cout << "\n"; 61 cout << "The output from the Gray code counter is:\n"; 62 } 63 64 void GrayCounter::Increment() 65 { 66 int i,j,carry,temp; 67 for (i=max;i>1;i--) 68 { 69 for (j=N-1;j>-1;j--) 70 { 71 if (j==(N-1)) 72 carry=1; 73 temp=B[j]; 74 B[j]=temp ^ carry; 75 carry=temp & carry; 76 } 77 BinaryToGray(); 78 } 79 } 80 81 void GrayCounter::Algorithm() 82 { 83 QueryN(); 84 InitializeB(); 85 BinaryToGray(); 86 Increment(); 87 } 88 89 int main() 90 { 91 Gray.Algorithm(); 92 return 0; 93 }