% C = bin_addition(a, b, Len) wandelt a und b in die
% Binärdarstellung um und berechnet anschließend C = a+b in
% dieser Darstellung. Ist Len ~= 0 wird nur mit Len Bits gerechnet.
% Ist Len = 0 wird mit einer Stelle mehr gerechnet, als die
% längere Zahlendarstellung beansprucht.

% Autor:     Matthias Bosewitz
% Tutorium:  Jan-Henning Hansen, Mo 10-12
% Aufgabe:   3.Übungszettel, 4c
% Benötigt:  convert2bin.m

function C = bin_addition(a,b,Len)

  A = convert2bin(a);   % a in eine Zeichenkette in Binärdarstellung
                        % umwandeln (mit führendem Vorzeichenbit und
                        % Komplementärdarstellung für negative a)
  B = convert2bin(b);   % b -> Binärdarstellung

  if (Len == 0)         % keine Länge angegeben
    Len = max( length(A), length(B) ) + 1;  % benötigte Länge
  end

  % Unterschiedlich lange Bitfolgen kann man nicht so addieren, also
  % bringen wir beide auf die Länge Len
  if (a < 0)    % Wenn es eine Komplementärdarstellung ist
    A = strcat('1'+zeros(1, Len-length(A)), A); % mit 1en auffüllen
                % zb. a = dezimal -5 = 1011, Len = 6 -> 111011
  else
    A = strcat('0'+zeros(1, Len-length(A)), A); % mit 0en auffüllen
                % zb. a = dezimal  5 = 0101, Len = 6 -> 000101
  end

  if (b < 0)    % Wenn es eine Komplementärdarstellung ist
    B = strcat('1'+zeros(1, Len-length(B)), B); % mit 1en auffüllen
  else
    B = strcat('0'+zeros(1, Len-length(B)), B); % mit 0en auffüllen
  end
  
  % Ausgabefolge erstellen
  C = char('0'+zeros(1, Len));      % Erstmal Len-Stellig '0'en
  % Später müssen also nur noch die stellen die 1 sein sollen auf
  % '1' geändert werden
  
  
  % Nun kann man normal addieren
  U = '0';           % Übertrag in dieser Variable sichern
  for i=Len:-1:1     % Alle Stellen durchgehen (Zahlen werden von
                     % Rechts nach links aufgeschrieben)
    
    if     A(i)+B(i)+U == '0'+'0'+'1'   % 0+0+1 = 1
      C(i)='1';  U='0';
    elseif A(i)+B(i)+U == '0'+'1'+'1'   % 0+1+1 = 10
      U='1';                            % C(i)='0' lasse ich weg
    elseif A(i)+B(i)+U == '1'+'1'+'1'   % 1+1+1 = 11
      C(i)='1';  U='1';
    elseif A(i)+B(i)+U == '0'+'0'+'0'   % 0+0+0 = 0
      U='0';                            % C(i)='0' lasse ich weg
    end
    
  end
  % Schlussendlich gibt die Funktion das fertige C aus.
  
end