Да пофиг на i, там в принципе код кривой. Деже если это поправить будет неправильно работать. Например, перенос считается, но не используется.
Если уж очень хочется самому, то как-то вот так:
Код:
uses
Math;
function BinAdd(D1, D2 : String) : String;
function BitChrToVal(C : Char) : Byte;
begin
Case C Of
'0' : Result := 0;
'1' : Result := 1;
Else Raise Exception.CreateFmt('Unexpected bit value - %s',[C]);
End;
end;
var
I, MaxLen : Integer;
Bit : Byte;
Shtt : Byte;
begin
if Length(D1) <> Length(D2) Then
Begin
MaxLen := Max(Length(D1),Length(D2));
While Length(D1) < MaxLen Do D1 := '0' + D1;
While Length(D2) < MaxLen Do D2 := '0' + D2;
End;
Result := '';
Shft := 0;
For I := MaxLen DownTo 1 Do
Begin
Bit := Shft + BitChrToVal(D1[i]) + BitChrToVal(D2[i]);
Shft := 0;
Case Bit Of
0 : Result := '0' + Result;
1 : Result := '1' + Result;
2 : Begin Result := '0' + Result; Shft := 1; End;
3 : Begin Result := '1' + Result; Shft := 1; End;
Else Raise Exception.Create('something went wrong - got bit intermediate value out of [0..3].');
End;
End;
If Shft > 0 Then Result := '1' + Result;
end;