#include #define BITS 4 #define bin2gray(v) (v^(v>>1)) unsigned gray2bin1(unsigned v){ unsigned sum = v, length = BITS; while(length > 0) v >>= 1, sum ^= v, length--; return sum; } unsigned gray2bin2(unsigned v){ unsigned i; for(i = 1; i < BITS; i <<= 1) v ^= (v >> i); return v; } unsigned gray2bin3(unsigned v){ v ^= v >> 1; /* для 2-разрядных чисел */ v ^= v >> 2; /* для 4-разрядных чисел */ v ^= v >> 4; /* для 8-разрядных чисел */ v ^= v >> 8; /* для 16-разрядных чисел */ v ^= v >> 16; /* для 32-разрядных чисел */ return v; } /*----------------------------------------------------------------------*/ void printbits(unsigned v){ unsigned i; printf(" - "); i = BITS; while(i > 0) printf("%u", (v >> --i) & 1); } int checkgray(unsigned i){ printf("%4u", i); printbits(i); printbits(bin2gray(i)); printf("\n"); if(i != gray2bin1(bin2gray(i)) || i != gray2bin2(bin2gray(i)) || i != gray2bin3(bin2gray(i))){ printf("%u: ошибка перевода из кода Грея!\n", i); return 0; } return 1; } #define mostSignBit(bits) (1ul << (bits - 1)) #define maxUnsigned(bits) (mostSignBit(bits) | (mostSignBit(bits) - 1)) void main(){ unsigned i; for(i = 0; checkgray(i) && i < (unsigned)maxUnsigned(BITS); i++); printf("done.\n"); }