//+------------------------------------------------------------------+
//|                                                     TestGray.mq5 |
//|                                Copyright 2007-2023, JQS aka Joo. |
//|                                https://www.mql5.com/en/users/joo |
//+------------------------------------------------------------------+
#property copyright "Copyright 2007-2023, JQS aka Joo."
#property link      "https://www.mql5.com/en/users/joo"
#property version   "1.00"
#property script_show_inputs


//1844 6744 0737 0955 1615: 20-digit number

//--- input parameters
input ulong    Input1 = 9999;

//——————————————————————————————————————————————————————————————————————————————
void OnStart()
{
  char charArray [];
  
  Print (Input1);
  
  DecimalToGray (Input1, charArray);
  
  ArrayPrint (charArray);
  
  Print (GrayToDecimal (charArray, 0, ArraySize (charArray) - 1));
}
//——————————————————————————————————————————————————————————————————————————————




//——————————————————————————————————————————————————————————————————————————————
//Converting a decimal number to a Gray code
void DecimalToGray (ulong decimalNumber, char &array [])
{
  ulong grayCode = decimalNumber ^ (decimalNumber >> 1);
  IntegerToBinary(grayCode, array);
}

//Converting a decimal number to a binary number
void IntegerToBinary (ulong number, char &array [])
{
  ArrayResize(array, 0);
  ulong temp;
  int cnt = 0;
  while (number > 0)
  {
    ArrayResize (array, cnt + 1);
    temp = number % 2;
    array [cnt] = (char)temp;
    number = number / 2;
    cnt++;
  }

  ArrayReverse (array, 0, WHOLE_ARRAY);
}
//——————————————————————————————————————————————————————————————————————————————

//——————————————————————————————————————————————————————————————————————————————
//Converting from Gray's code to a decimal number
ulong GrayToDecimal (const char &grayCode [], int startInd, int endInd)
{
  //if (startInd && grayIntegDigits == 0) return 0.0;

  ulong grayCodeS = BinaryToInteger(grayCode, startInd, endInd);
  ulong result = grayCodeS;

  while ((grayCodeS >>= 1) > 0)
  {
    result ^= grayCodeS;
  }
  return result;
}

//Converting a binary string to a decimal number
ulong BinaryToInteger (const char &binaryStr [], const int startInd, const int endInd)
{
  ulong result = 0;
  if (startInd == endInd) return 0;

  for (int i = startInd; i <= endInd; i++)
  {
    result = (result << 1) + binaryStr [i];
  }
  return result;
}
//——————————————————————————————————————————————————————————————————————————————
