Skip to content

Commit bc81f11

Browse files
authored
Create gray_code.cpp
1 parent f789e3b commit bc81f11

File tree

1 file changed

+97
-0
lines changed

1 file changed

+97
-0
lines changed

bit_manipulation/gray_code.cpp

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/**
2+
* @brief Program to generate n-bit [Gray
3+
* code](https://en.wikipedia.org/wiki/Gray_code)
4+
*
5+
* @details
6+
* Gray code is a binary numeral system
7+
* where consecutive values differ in exactly 1 bit.
8+
* The following code offers one of many possible Gray codes
9+
* given some pre-determined number of bits.
10+
*/
11+
12+
#include <bitset> /// for gray code representation
13+
#include <cassert> /// for assert
14+
#include <iostream> /// for IO operations
15+
#include <vector> /// for vector data structure
16+
17+
/**
18+
* @brief Generate n-bit Gray code
19+
*
20+
* @param n Number of bits
21+
* @return A vector that stores the n-bit Gray code
22+
*/
23+
24+
std::vector<std::bitset<32>> gray_code_generation(int n) {
25+
std::vector<std::bitset<32>> gray_code = {}; // Initialise empty vector
26+
27+
// No Gray codes for non-positive values of n
28+
if (n <= 0) {
29+
return gray_code;
30+
}
31+
32+
int total_codes = 1 << n; // Number of n-bit gray codes
33+
34+
for (int i = 0; i < total_codes; i++) {
35+
int gray_num = i ^ (i >> 1); // Gray code formula
36+
gray_code.push_back(std::bitset<32>(gray_num)); // Store the value
37+
}
38+
39+
return gray_code;
40+
}
41+
42+
/**
43+
* @brief Self-test implementation
44+
*
45+
* @returns void
46+
*/
47+
48+
static void test() {
49+
std::vector<std::bitset<32>> gray_code_0 = {};
50+
51+
std::vector<std::bitset<32>> gray_code_1 = {
52+
std::bitset<32>(0), std::bitset<32>(1)
53+
};
54+
55+
std::vector<std::bitset<32>> gray_code_2 = {
56+
std::bitset<32>(0), std::bitset<32>(1), std::bitset<32>(3), std::bitset<32>(2)
57+
};
58+
59+
std::vector<std::bitset<32>> gray_code_3 = {
60+
std::bitset<32>(0), std::bitset<32>(1), std::bitset<32>(3), std::bitset<32>(2),
61+
std::bitset<32>(6), std::bitset<32>(7), std::bitset<32>(5), std::bitset<32>(4)
62+
};
63+
64+
std::vector<std::bitset<32>> gray_code_4 = {
65+
std::bitset<32>(0), std::bitset<32>(1), std::bitset<32>(3), std::bitset<32>(2),
66+
std::bitset<32>(6), std::bitset<32>(7), std::bitset<32>(5), std::bitset<32>(4),
67+
std::bitset<32>(12), std::bitset<32>(13), std::bitset<32>(15), std::bitset<32>(14),
68+
std::bitset<32>(10), std::bitset<32>(11), std::bitset<32>(9), std::bitset<32>(8)
69+
};
70+
71+
std::vector<std::bitset<32>> gray_code_5 = {
72+
std::bitset<32>(0), std::bitset<32>(1), std::bitset<32>(3), std::bitset<32>(2),
73+
std::bitset<32>(6), std::bitset<32>(7), std::bitset<32>(5), std::bitset<32>(4),
74+
std::bitset<32>(12), std::bitset<32>(13), std::bitset<32>(15), std::bitset<32>(14),
75+
std::bitset<32>(10), std::bitset<32>(11), std::bitset<32>(9), std::bitset<32>(8),
76+
std::bitset<32>(24), std::bitset<32>(25), std::bitset<32>(27), std::bitset<32>(26),
77+
std::bitset<32>(30), std::bitset<32>(31), std::bitset<32>(29), std::bitset<32>(28),
78+
std::bitset<32>(20), std::bitset<32>(21), std::bitset<32>(23), std::bitset<32>(22),
79+
std::bitset<32>(18), std::bitset<32>(19), std::bitset<32>(17), std::bitset<32>(16)
80+
};
81+
82+
assert(gray_code_generation(0) == gray_code_0);
83+
assert(gray_code_generation(1) == gray_code_1);
84+
assert(gray_code_generation(2) == gray_code_2);
85+
assert(gray_code_generation(3) == gray_code_3);
86+
assert(gray_code_generation(4) == gray_code_4);
87+
assert(gray_code_generation(5) == gray_code_5);
88+
}
89+
90+
/**
91+
* @brief Main function
92+
* @returns 0 on exit
93+
*/
94+
int main() {
95+
test(); //Run self-test implementation
96+
return 0;
97+
}

0 commit comments

Comments
 (0)