private static void Set(string Encoding, ShaderDecodeFunc Func) { if (Encoding.Length != EncodingBits) { throw new ArgumentException(nameof(Encoding)); } int Bit = Encoding.Length - 1; int Value = 0; int XMask = 0; int XBits = 0; int[] XPos = new int[Encoding.Length]; for (int Index = 0; Index < Encoding.Length; Index++, Bit--) { char Chr = Encoding[Index]; if (Chr == '1') { Value |= 1 << Bit; } else if (Chr == 'x') { XMask |= 1 << Bit; XPos[XBits++] = Bit; } } XMask = ~XMask; ShaderDecodeEntry Entry = new ShaderDecodeEntry(Func, XBits); for (int Index = 0; Index < (1 << XBits); Index++) { Value &= XMask; for (int X = 0; X < XBits; X++) { Value |= ((Index >> X) & 1) << XPos[X]; } if (OpCodes[Value] == null || OpCodes[Value].XBits > XBits) { OpCodes[Value] = Entry; } } }
private static void Set(string encoding, ShaderDecodeFunc func) { if (encoding.Length != EncodingBits) { throw new ArgumentException(nameof(encoding)); } int bit = encoding.Length - 1; int value = 0; int xMask = 0; int xBits = 0; int[] xPos = new int[encoding.Length]; for (int index = 0; index < encoding.Length; index++, bit--) { char chr = encoding[index]; if (chr == '1') { value |= 1 << bit; } else if (chr == 'x') { xMask |= 1 << bit; xPos[xBits++] = bit; } } xMask = ~xMask; ShaderDecodeEntry entry = new ShaderDecodeEntry(func, xBits); for (int index = 0; index < (1 << xBits); index++) { value &= xMask; for (int x = 0; x < xBits; x++) { value |= ((index >> x) & 1) << xPos[x]; } if (_opCodes[value] == null || _opCodes[value].XBits > xBits) { _opCodes[value] = entry; } } }