program Mad_Adder; {$APPTYPE Console} // en.wikipedia.org/wiki/Adder_%28electronics%29#Full_adder //------------------------------------------------------------------------------ type Bit = 0..1; var NullBit : Bit = 0; //------------------------------------------------------------------------------ type TAdder = class A : ^Bit; B : ^Bit; CIn : ^Bit; Cout : Bit; S : Bit; procedure Compute ; end; procedure TAdder.Compute; var tmp : Bit; begin tmp := (A^ XOR B^ ); S := (tmp XOR CIn^); COut := (tmp AND CIn^) AND (A^ AND B^); end; //------------------------------------------------------------------------------ type TByteAdder = class A : array[0..7] of Bit; B : array[0..7] of Bit; Adder : array[0..7] of TAdder; procedure Compute (const A, B : Byte; var Result : Byte; var Carry : Bit); constructor Create ; destructor Destroy ; override; end; procedure TByteAdder.Compute(const A, B : Byte; var Result : Byte; var Carry : Bit); var i : Integer; begin for i := 0 to 7 do begin Self.A[i] := A SHR i; Self.B[i] := B SHR i; end; for i := 0 to 7 do Adder[i].Compute; Result := (Byte(Adder[7].S) SHL 7) OR (Byte(Adder[6].S) SHL 6) OR (Byte(Adder[5].S) SHL 5) OR (Byte(Adder[4].S) SHL 4) OR (Byte(Adder[3].S) SHL 3) OR (Byte(Adder[2].S) SHL 2) OR (Byte(Adder[1].S) SHL 1) OR (Byte(Adder[0].S) SHL 0); Carry := Adder[7].COut; end; constructor TByteAdder.Create; var i : Integer; begin inherited Create; for i := 0 to 7 do begin Adder[i] := TAdder.Create; with Adder[i] do begin A := @Self.A[i]; B := @Self.B[i]; if (i <> 0) then CIn := @Adder[i - 1].Cout; end; end; Adder[0].CIn := @NullBit; end; destructor TByteAdder.Destroy; var i : Integer; begin for i := 0 to 7 do Adder[i].Free; inherited Destroy; end; //------------------------------------------------------------------------------ const A = 1; B = 1; var ByteAdder : TByteAdder; Carry : Byte; Result : Byte; begin ByteAdder := TByteAdder.Create; try ByteAdder.Compute(A, B, Result, Carry); Write(A, ' + ', B, ' = ', Result); if (Carry <> 0) then Write(' with carry'); WriteLn; finally ByteAdder.Free; end; end.