/// <summary>
        ///
        /// </summary>
        /// <param name="targetX">X[i]</param>
        /// <param name="targetY">Y[i]</param>
        /// <param name="expression"></param>
        /// <returns></returns>

        public static int Generate(ref ulong Hash, ref ulong Seed, ref ulong limitDeOperações, ref byte[] X, ref byte[] Y, out string expression)
        {
            string          stringOperation = string.Empty;
            List <Operação> Operações       = new List <Operação>();

            ulong elementsAdded = 0;
            ulong insideTry     = 0;

            for (ulong operações = 0; operações < limitDeOperações; operações++)
            {
                Operação op       = new Operação();
                char     Operador = GetOperand(true, Seed, ref insideTry, ref elementsAdded);

                stringOperation += "(";

                op.A = GenerateVariável(Seed, ref insideTry, ref elementsAdded, ref X, ref Y);

                if (Operador == Operands[6]) // ~ NOT
                {
                    op.A.Value = (byte)((~op.A.Value) & 255);

                    stringOperation += Operador + VariáveltoExpression(op.A) + " ";
                    Operador         = GetOperand(false, Seed, ref insideTry, ref elementsAdded);
                }
                else
                {
                    stringOperation += VariáveltoExpression(op.A) + " ";
                }

                op.B = GenerateVariável(Seed, ref insideTry, ref elementsAdded, ref X, ref Y);

                stringOperation += Operador + " " + VariáveltoExpression(op.B) + " ";

                // op.Resultado = (byte)(operators[Operador](op.A.Value, op.B.Value) % 256);
                op.Resultado = (byte)(CalcularOperação(Operador, new int[] { op.A.Value, op.B.Value }) % 256);
                op.Operador  = Operador;
                Operações.Add(op);

                stringOperation += ") ";

                if (operações + 1 < limitDeOperações)
                {
                    Operações.Add(new Operação()
                    {
                        Operador = GetOperand(false, Seed, ref insideTry, ref elementsAdded)
                    });
                    stringOperation += Operações[Operações.Count - 1].Operador + " ";
                }
            }

            // Agora calcular o resultado da expressão

            int resultado = CalcularResultadoOperações(Operações);

            expression = stringOperation;

            return(resultado);
        }
        private static int CalcularResultadoOperações(List <Operação> Operações)
        {
            // Agora calcular o resultado da expressão

aindaHáOperações:
            List <Operação> temp = new List <Operação>();

            for (int i = 0; i < Operações.Count; i++)
            {
                Operação a = Operações[i];
                i++;
                char operador = Operações[i].Operador;
                i++;
                Operação b = Operações[i];

                Operação resultado = new Operação();
                // resultado.Resultado = (byte)(operators[operador](a.Resultado, b.Resultado) % 256);
                resultado.Resultado = (byte)(CalcularOperação(operador, new int[] { a.Resultado, b.Resultado }) % 256);
                temp.Add(resultado);

                if (i == Operações.Count - 1)
                {
                    break;
                }
                i++;
                temp.Add(Operações[i]);
            }

            if (temp.Count != 1)
            {
                Operações = temp;
                goto aindaHáOperações;
            }

            return((byte)temp[0].Resultado);
        }
        public static int Calculate(byte[] compareX, byte[] compareY, ref string expression)
        {
            List <Operação> Operações = new List <Operação>();
            // Vars = new List<Variável>();

            StringReader Reader = new StringReader(expression.Replace(" ", ""));
            bool         B      = false;

            char c = (char)Reader.Peek();

            while (Reader.Peek() != -1)
            {
                c = (char)Reader.Peek();

                if (c == '(')
                {
                    Operação op = new Operação(); //    (~X[10] ^ ~Y[21] ) ^ (~Y[9] & ~X[24] )
                    Reader.Read();

VOLTA:

                    c = (char)Reader.Peek();

                    if (c == '~')
                    {
                        Reader.Read();

                        char Letra = (char)Reader.Peek();
                        Reader.Read(); // [
                        Reader.Read(); // index

                        string numero = string.Empty;
                        int    index  = 0;

                        while (char.IsNumber((char)Reader.Peek()))
                        {
                            numero += (char)Reader.Peek();
                            Reader.Read();
                        }
                        index = int.Parse(numero);

                        Reader.Read(); // ]

                        if (!B)
                        {
                            op.A = GetVariável(ref compareX, ref compareY, Letra, index, true);
                            //  if(Vars != null)
                            //  Vars.Add(op.A);
                            B = true;
                            goto VOLTA;
                        }
                        else    // A já foi prenchido, agora B
                        {
                            op.B = GetVariável(ref compareX, ref compareY, Letra, index, true);
                            //  if (Vars != null)
                            //     Vars.Add(op.B);
                        }

                        Reader.Read(); // )

                        if (B)
                        {
                            Operações.Add(op);
                            // op.Resultado = (byte)(operators[op.Operador](op.A.Value, op.B.Value) % 256);
                            op.Resultado = (byte)(CalcularOperação(op.Operador, new int[] { op.A.Value, op.B.Value }) % 256);
                            B            = false;
                            continue;
                        }
                    }
                    else if (IsOperand(c))
                    {
                        op.Operador = c;
                        Reader.Read();
                        goto VOLTA;
                    }
                    else
                    {
                        char Letra = (char)Reader.Peek();
                        Reader.Read(); // [
                        Reader.Read(); // index

                        string numero = string.Empty;
                        int    index  = 0;

                        while (char.IsNumber((char)Reader.Peek()))
                        {
                            numero += (char)Reader.Peek();
                            Reader.Read();
                        }

                        index = int.Parse(numero);

                        Reader.Read(); // ]

                        if (!B)
                        {
                            op.A = GetVariável(ref compareX, ref compareY, Letra, index);
                            //  if (Vars != null)
                            //      Vars.Add(op.A);
                            B = true;
                            goto VOLTA;;
                        }
                        else // A já foi prenchido, agora B
                        {
                            op.B = GetVariável(ref compareX, ref compareY, Letra, index);
                            //  if (Vars != null)
                            //     Vars.Add(op.B);
                        }

                        Reader.Read(); // )

                        if (B)
                        {
                            //op.Resultado = (byte)(operators[op.Operador](op.A.Value, op.B.Value) % 256);
                            op.Resultado = (byte)(CalcularOperação(op.Operador, new int[] { op.A.Value, op.B.Value }) % 256);
                            Operações.Add(op);
                            B = false;
                            continue;
                        }
                    }
                }
                else if (IsOperand(c))
                {
                    Operações.Add(new Operação()
                    {
                        Operador = c
                    });
                    Reader.Read(); // (
                }
            }

            return(CalcularResultadoOperações(Operações));
        }