public MaskedLong invAnd(MaskedLong that) throws SolverException {
		long newMsk = this.msk & that.msk;
		long newVal = this.val;

		// Check for the error case
		if ((newMsk & this.val & ~that.val) != 0) {
			throw new SolverException("0 & X == 1 cannot be solved.");
		}

		// Make 0,0 give x (this will also get everything where that==0)
		newMsk &= that.val;
		// Make x,1 give 1 (this will also get everything where this==1)
		newMsk |= this.val;

		// No need to remask. I checked the arithmetic.
		assert newVal == (newMsk & newVal);
		// Eh, the constructor does it anyway....
		return fromMaskAndValue(newMsk, newVal);
	}
Solves the expression {@code A & B = C, for B, given C and A}

<p>
To handle unknown bits, the solution is derived from the following truth table, where
{@code *} indicates no solution:

<pre>{@code
  0 x 1 <= A (that)
0 x x 0
x x x x
1 * 1 1
^
B (this)
}</pre>

@param that the other masked long ({@code B}).
@return the result.
@throws SolverException if no solution exists.
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/expr/MaskedLong.java