// GrayCode.cpp
#include <iostream>
long int GetGrayCode(long int iIn);
unsigned char GetBitValue(long int liMod, unsigned char ucBitPlace);
void OutputGreyCodeBinary(unsigned long int uliGrey);
using namespace std;
int main(int argc, char* argv[])
{
long int liInNumber, liGrayCode;
bool bCont = true;
while(bCont)
{
//Zahl einlesen
cout << "Bitte Zahl eingeben (Beenden mit 0): ";
cin >> liInNumber;
if(liInNumber == 0)
{
cout << "Beendet!" << endl;
bCont = false;
}
else
{
//GrayCode ermitteln
liGrayCode = GetGrayCode(liInNumber);
//GrayCode ausgeben
cout << "GreyCode binär: ";
OutputGreyCodeBinary(liGrayCode);
cout << endl;
}
}
return 0;
}
long int GetGrayCode(long int liIn)
{
long int liMod, liGray = 0;
unsigned char ucBitPlace = 0, ucCounter = 0, ucBitVal;
do
{
ucCounter++;
liMod = liIn % (ucCounter * 4);
ucBitVal = GetBitValue(liMod, ucBitPlace);
if(ucBitVal)
{
liGray |= (1 << ucBitPlace);
}
ucBitPlace++;
}while(liIn > (1 << ucCounter));
return liGray;
}
unsigned char GetBitValue(long int liModIn, unsigned char ucBit)
{
unsigned char ucBitVal = 0;
long int liLower, liUpper, liMod = liModIn + 1;
liLower = 1 << ucBit;
liUpper = 4;
for(int i = 0; i < ucBit; i++)
{
liUpper = (liUpper * 2) - 1;
}
if((liMod > liLower) && (liMod < liUpper))
ucBitVal = 1;
return ucBitVal;
}
void OutputGreyCodeBinary(unsigned long int uliGrey)
{
unsigned long int uliMask = 0x80000000;
//Nullen am Anfang überspringen
while((uliGrey & uliMask) == 0)
uliMask >>= 1;
while(uliMask > 0)
{
if((uliGrey & uliMask) == 0)
cout << '0';
else
cout << '1';
uliMask >>= 1;
}
}