public static FlatExpression Not(FlatExpression a)
        {
            if (a._operands.Count >= 64)
            {
                throw new NotImplementedException();
            }
            var   maxLines      = 1ul << a._operands.Count;
            var   expectedLines = (1ul << a._operands.Count) - (ulong)a._lines.Length;
            var   lines         = new FlatExpressionLine[expectedLines];
            long  index         = 0;
            long  j             = 0;
            ulong i             = 0;

            for (; i < maxLines && index < a._lines.LongLength; ++i)
            {
                if (i < a._lines[index].Mask)
                {
                    lines[j] = new FlatExpressionLine(i);
                    ++j;
                }
                else
                {
                    ++index;
                }
            }
            for (; i < maxLines; ++i)
            {
                lines[j] = new FlatExpressionLine(i);
                ++j;
            }
            return(new FlatExpression(a.Operands, lines.ToArray()));
        }
Exemplo n.º 2
0
            public override FlatExpressionLine[] GetVariations(IReadOnlyList <FlatExpressionLine> lines)
            {
                var newValues = new FlatExpressionLine[lines.Count * (1 << _map.UnusedCount)];

                var index = 0;

                foreach (var flatExpressionLine in lines)
                {
                    var mask = _map.Remap(flatExpressionLine.Mask);
                    foreach (var variation in _variations)
                    {
                        newValues[index] = new FlatExpressionLine(mask | variation);
                        ++index;
                    }
                }

                return(newValues);
            }
Exemplo n.º 3
0
            public override FlatExpressionLine[] GetVariations(IReadOnlyList <FlatExpressionLine> lines)
            {
                var values = new FlatExpressionLine[lines.Count * (1 << _map._varitationBits)];
                var step   = 1ul << _map._varitationOffset;
                var end    = step << _map._varitationBits;
                var index  = 0;

                foreach (var flatExpressionLine in lines)
                {
                    for (ulong i = 0; i < end; i += step)
                    {
                        values[index] = new FlatExpressionLine(flatExpressionLine.Mask | i);
                        ++index;
                    }
                }

                return(values);
            }