Gray code, also known as Gray binary code or reflected binary code, is a binary numeral system where adjacent values differ by only one bit. In other words, Gray code is a binary code where each successive value differs from the previous value by only one bit.

For example, the binary representation of decimal numbers 1 and 2 is 0001 and 0010 respectively. Note that two LSB bits (bit#0 and bit#1) have to change for the transition from 1 to 2. In Gray code, 1 and 2 are represented by 0001 and 0011 respectively but the same transition now requires only a change of one bit (bit#1 from LSB). This code is used in many applications, including digital communications, error correction, and electronic devices. One of the main advantages of Gray code is that it eliminates the possibility of errors that could occur when transitioning between two consecutive binary values.

Here's the Gray code for binary values from 0 to 15.

DecimalBinaryGray
000000000
100010001
200100011
300110010
401000110
501010111
601100101
701110100
810001100
910011101
1010101111
1110111110
1211001010
1311011011
1411101001
1511111000

## Common Usage

Gray code is used in digital-to-analog converters (DACs) and analog-to-digital converters (ADCs) to reduce the likelihood of errors in the conversion process. In these applications, the Gray code is used to represent the output voltage or the input signal in a way that minimizes the error due to small variations in the voltage or signal level.

Another application of Gray code is in error detection and correction. By using Gray code to represent data, errors caused by noise or other factors can be detected and corrected more easily than with other binary codes.

Gray code is also used to represent the data being transferred between two clock domains. The data is first encoded into Gray code in the source clock domain, and then decoded from Gray code in the destination clock domain. The advantage of using Gray code in clock domain crossing (CDC) is that it minimizes the probability of errors caused by metastability, which can occur when data is sampled at an uncertain time between two clock edges. With Gray code, even if the data is sampled at the wrong time, the resulting error is limited to a single bit flip, which can be detected and corrected more easily than if multiple bits had changed.

## Binary to Gray Code

Converting a binary number to its equivalent Gray code representation involves a simple algorithm that can be applied to each bit in the binary number. Here's the algorithm:

1. Start with the most significant bit (MSB) of the binary number and copy it to the corresponding bit in the Gray code.
2. For each subsequent bit of Gray code, set it to 0 if values in the corresponding bit position in binary and the previous bit position are same, else 1.

Here's an example to illustrate the algorithm:

`Binary number: 101011`
1. Copy the most significant bit (MSB) to the corresponding bit in the Gray code.
2. 3. For bit#4 in Gray, bit#5 and bit#4 in binary are different (1 and 0), so result should be 1.
4. 5. For bit#3 in Gray, bit#4 and bit#3 in binary are different (0 and 1), so result should be 1.
6. 7. For bit#2 in Gray, bit#3 and bit#2 in binary are different (1 and 0), so result should be 1.
8. 9. For bit#1 in Gray, bit#2 and bit#1 in binary are different (0 and 1), so result should be 1.
10. 11. For bit#0 in Gray, bit#1 and bit#0 in binary are same (1 and 1), so result should be 0.
12. 