Erstellt für das Schulfach TINF

Homepage/Rechnen Bitmanipulation

« Homepage

In diesem Program wird das Addieren bzw. Subtrahieren mit Bitmanipulation durchgeführt. Es wird hier kein + oder - für die Berechnungen benutzt! Es werden auch keine IOs verwendet. Deshalb habe ich hier nicht auf Effizienz gebaut, sondern auf eine saubere Funktion.

#include <mbed.h>

Serial pc(USBTX, USBRX);

// Verwendete Variabeln
unsigned char a = NULL;
unsigned char b = NULL;
unsigned char sign = NULL;
unsigned char result = NULL;

// Rechenfunktionen (+, -)
unsigned char Addition(unsigned char a, unsigned char b);
unsigned char Subtraktion(unsigned char a, unsigned char b);


int main() 
{
  pc.baud(9600);
  pc.printf("Zahl mittels ASCII-Tabelle auswählen und Rechenoperation nur +,- akzeptiert!\nViel Spaß ;)\n\n\n");

  while(1)
  {
    if (pc.readable() && a == NULL && sign == NULL && b == NULL)
    {
      // 1. Zahl
      a = pc.getc();
      pc.printf("Die 1. Zahl ist %d (%c)!\n", a, a);


      // Rechneoperation (+, -)
      // Wenn kein + oder - gesetzt wird, wird ein neue Eingabe aufgefordert
      do
      {
        while(!pc.readable()) {}
        sign = pc.getc();
      } while(sign != '+' && sign != '-');
      pc.printf("Die Rechnung wird %c gerechnet!\n", sign);


      // 2. Zahl
      while(!pc.readable()) {}
      b = pc.getc();
      pc.printf("Die 2. Zahl ist %d (%c)!\n\n", b, b);




      // Berechnen
      if (sign == '-')
      {
        result = Subtraktion(a, b);
      }

      else if (sign == '+')
      {
        result = Addition(a, b);
      }

      pc.printf("%d %c %d = %d\n\n\n", a, sign, b, result);
    }



    else
    {
        // Alle Werte zurücksetzen
        a = NULL;
        b = NULL;
        sign = NULL;
        result = NULL;
    }
  }

}


unsigned char Addition(unsigned char a, unsigned char b)
{
    // Exor für Addieren und AND für den Übertrag
    // Der muss natürlich hinzuaddiert werden (Shift)
    // Wäre jedoch ein weiterer Übertrag, dann muss der zuerst berücksichtigt werden (z&c)
    // Dann darf mittels Verodern die Addition beendet werden
    
    
    unsigned char z = a ^ b;
    unsigned char c = a & b;
    c <<= 1;
  
    while((z&c) > 0)
    {
      a = z;
      b = c;
      
      z = a ^ b;
      c = a & b;
      c <<= 1;
    }
    
    
    int result = z | c;
    return result;
}

unsigned char Subtraktion(unsigned char a, unsigned char b)
{
    // Mit Einer + Zweierkomplimet und dann Addieren
    
    b = ~b;
    unsigned char c = Addition(b, 1);
    unsigned char result = Addition(a, c);
    
    return result;
}

Zurück


All wikipages