NANDだけではダメだ。シフト命令と条件分岐が必要だ

論理演算だけの加算
function add(a,b:Integer):Integer;
var c:Integer;
begin
repeat
c:=(a and b);
a:=a xor b;
b:=c shl 1;
until b=0;
Result:=a;
end;

減算
function sub(a,b:Integer):Integer;//a-b
var c:Integer;
begin
repeat
c:=((not a) and b);
a:=a xor b;
b:=c shl 1;
until b=0;
Result:=a;
end;