Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- The purpose of this function is to convert an unsigned
- binary number to reflected binary Gray code.
- The operator >> is shift right. The operator ^ is exclusive or.
- */
- unsigned int binaryToGray(unsigned int num)
- {
- return (num >> 1) ^ num;
- }
- /*
- The purpose of this function is to convert a reflected binary
- Gray code number to a binary number.
- */
- unsigned int grayToBinary(unsigned int num)
- {
- unsigned int mask;
- for (mask = num >> 1; mask != 0; mask = mask >> 1)
- {
- num = num ^ mask;
- }
- return num;
- }
- unsigned int nextGray(unsigned int num)
- {
- return binaryToGray((grayToBinary(num) + 1) & 0x3F);
- }
- unsigned int prevGray(unsigned int num)
- {
- return binaryToGray((grayToBinary(num) - 1) & 0x3F);
- }
- unsigned next_gray(unsigned gray)
- {
- if (is_gray_odd(gray))
- {
- unsigned y = gray & -gray;
- return gray ^ (y << 1);
- }
- else
- {
- // Flip rightmost bit
- return gray ^ 1;
- }
- }
- bool is_gray_odd(unsigned gray)
- {
- // A gray code is odd when the number
- // of bits set in its representation
- // is odd
- // If you have a popcount function
- // available, use it instead of the
- // following manual one
- unsigned nb_bits = 0u;
- for (; gray ; ++nb_bits)
- {
- // clear the least significant bit set
- gray &= gray - 1;
- }
- return (bool)(nb_bits % 2);
- }
- bool is_gray_odd(unsigned gray)
- {
- return (bool) __builtin_parity(gray);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement