// A possible solution abstract class Gate { abstract boolean output (); } abstract class BinaryGate extends Gate { protected boolean a, b; protected BinaryGate (boolean a, boolean b) { this.a = a; this.b = b; } } class And extends BinaryGate { And (boolean a, boolean b) { super(a,b); } public boolean output () { return (a && b); } } class Or extends BinaryGate { Or (boolean a, boolean b) { super(a,b); } public boolean output () { return (a || b); } } abstract class UnaryGate extends Gate { } class Not extends UnaryGate { private boolean a; Not (boolean a) { this.a = a; } public boolean output () { return (!a); } } class TestGate { public static void main (String[] args) { System.out.println("F and F = " + new And(false,false).output()); System.out.println("F and T = " + new And(false,true).output()); System.out.println("T and F = " + new And(true,false).output()); System.out.println("T and T = " + new And(true,true).output()); System.out.println("F or F = " + new Or(false,false).output()); System.out.println("F or T = " + new Or(false,true).output()); System.out.println("T or F = " + new Or(true,false).output()); System.out.println("T or T = " + new Or(true,true).output()); System.out.println("not F = " + new Not(false).output()); System.out.println("not T = " + new Not(true).output()); } } class OneBitComparator extends BinaryGate { OneBitComparator (boolean a, boolean b) { super(a,b); } public boolean output () { boolean ab = a && b; boolean nanb = (!a) && (!b); return (ab || nanb); } } class NBitComparator { boolean[] bs1, bs2; NBitComparator (boolean[] bs1, boolean[] bs2) { this.bs1 = bs1; this.bs2 = bs2; } NBitComparator (String s1, String s2) { this.bs1 = toBoolArray(s1); this.bs2 = toBoolArray(s2); } boolean output () { int l1 = bs1.length; int l2 = bs2.length; if (l1 != l2) return false; boolean b; for (int i=0; i