Показать сообщение отдельно
  #6  
Старый 30.11.2017, 19:41
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да пофиг на 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;
Ответить с цитированием