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 }