Funktionierender 4 Bit Volladdiere in C?
Ich hab eine Aufgabe erhalten und sitze daran schon eine ganze weile:
Aufgabe 3: 4-Bit-Volladdierer Schreiben Sie ein C-Programm, das die Funktionalität eines 4-Bit-Volladdierers simuliert. Ein Nutzer gibt zwei Zahlen a und b ein, die jeweils im Bereich von 0 bis 15 liegen müssen. Liegt eine Zahl außerhalb dieses Bereichs, bricht das Programm mit einer Fehlermeldung ab. Die beiden Zahlen werden binär addiert, wobei für jede Stelle der verwendete Übertrag angezeigt werden muss. Das Ergebnis darf mit 5 Bit ausgegeben werden. Eine Beispielausgabe des Programms kann z.B. wie folgt aussehen:
Enter first number from 0 to 15: 7
Enter second number from 0 to 15: 12
00111 (x)
+ 01100 (y)
c 11000 (Übertrag)
-------------------
10011 (x + y)
Hinweis: Bei dieser Aufgabe bietet es sich an, mit binären Operatoren zu arbeiten.
Mein Programm dafür war erstmal wie folgt. Dabei Handelt es sich um die Programmiersprache C :
Ich hab es auch schon mit Bitweise Operatoren versucht komme aber nicht weiter.
Mir wurde gesagt, man könne mit >> und << Operatoren diese Aufgabe lösen
#include <stdio.h>
// Funktion zur Ausgabe der Binärdarstellung einer Zahl
void printBinary(int num, int bits) {
for (int i = bits - 1; i >= 0; i--) {
printf("%d", (num >> i) & 1);
}
}
int main() {
// Benutzereingabe für die beiden 4-Bit-Zahlen
int a, b;
printf("\n");
printf("\n");
// Eingabe für die erste Zahl
printf(" Tippe deine erste Zahl zwischen 0 und 15 ein: ");
scanf("%d", &a);
// Überprüfung der Gültigkeit der Eingabe
if (a < 0 || a > 15) {
printf("Error: Zahl liegt nicht zwischen 0 und 15\n");
printf(" Programm beendet...\n");
return 1; // Programm mit Fehlercode beenden
}
// Eingabe für die zweite Zahl
printf("Tippe deine zweite Zahl zwischen 0 und 15 ein ");
scanf("%d", &b);
// Überprüfung der Gültigkeit der Eingabe
if (b < 0 || b > 15) {
printf("Error: Zahl liegt nicht zwischen 0 und 15\n");
printf(" Programm beendet...\n");
return 1; // Programm mit Fehlercode beenden
}
printf("\n");
// Berechnung des 4-Bit-Volladdierers
int summe = a + b;
int uebertrag = (a & b) << 1;
// Ausgabe des Ergebnisses im binären Format
printf(" ");
printBinary(a, 5);
printf(" (x)\n");
printf("+ ");
printBinary(b, 5);
printf(" (y)\n");
printf("U ");
printBinary(uebertrag, 5);
printf(" (Uebertrag)\n");
printf("-------------------\n");
printf("+ ");
printBinary(summe, 5);
printf(" (x + y)\n");
return 0; // Programm erfolgreich beenden
}
Was ist jetzt genau die Frage?
Also das Programm funktioniert nicht wie es soll. Es sollen zwei Zahlen angegeben werden und diese sollen dann verrechnet werden zusätzlich soll der Übertrag korrekt angezeigt werd
1 Antwort
Die Berechnung des Übertrags stimmt nicht. Der Übertrag ist das Ergebnis der Addition der beiden Bits an der rechten Stelle. In deinem Programm wird der Übertrag jedoch berechnet, indem die beiden Zahlen multipliziert werden.
int uebertrag = (a & b) | ((a ^ b) & (a ^ (a + b)));
hätte es sowieso anders geschrieben, möchte jetzt aber nicht deinen ganzen code umändern, versuchs erst mal so.
#include <stdio.h>
void printBinary(int num, int bits) {
for (int i = bits - 1; i >= 0; i--) {
printf("%d", (num >> i) & 1);
}
}
int main() {
int a, b;
printf("\n");
printf("\n");
printf(" Tippe deine erste Zahl zwischen 0 und 15 ein: ");
scanf("%d", &a);
if (a < 0 || a > 15) {
printf("Error: Zahl liegt nicht zwischen 0 und 15\n");
printf(" Programm beendet...\n");
return 1;
}
printf("Tippe deine zweite Zahl zwischen 0 und 15 ein ");
scanf("%d", &b);
if (b < 0 || b > 15) {
printf("Error: Zahl liegt nicht zwischen 0 und 15\n");
printf(" Programm beendet...\n");
return 1;
}
printf("\n");
int summe = a + b;
int uebertrag = (a & b) | ((a ^ b) & (a ^ (a + b)));
printf(" ");
printBinary(a, 5);
printf(" (x)\n");
printf("+ ");
printBinary(b, 5);
printf(" (y)\n");
printf("U ");
printBinary(uebertrag, 5);
printf(" (Uebertrag)\n");
printf("-------------------\n");
printf("+ ");
printBinary(summe, 5);
printf(" (x + y)\n");
return 0;
}
Das war mein Fehler, ich habe nicht bedacht dass es natürlich auch außnahmen gibt. Wenn beide Zahlen gleich sind, ist der Übertrag 0. Das ist richtig, da in diesem Fall kein Übertrag von der rechten Stelle benötigt wird. Wenn beide Zahlen 1 sind, ist der Übertrag 1. Das ist natürlich falsch, da in diesem Fall ein Übertrag von der rechten Stelle benötigt wird. Also muss man den Abschnitt erweitern:
int uebertrag = ((a & b) | ((a ^ b) & (a ^ (a + b)))) | ((a == b) & ((a + b) == 15));
er rechnet den übertrag wie jetzt auch, nur prüft er jetzt, ob beide Zahlen gleich sind und ob die Summe 15 ist. Wenn ja, ist der Übertrag 1.
das sollte jetzt eigentlich so funktionieren, wenn nicht zeige ich dir wie ich es gemacht hätte.
#include <stdio.h>
void printBinary(int num, int bits) {
for (int i = bits - 1; i >= 0; i--) {
printf("%d", (num >> i) & 1);
}
}
int main() {
int a, b;
printf("\n");
printf("\n");
printf(" Tippe deine erste Zahl zwischen 0 und 15 ein: ");
scanf("%d", &a);
if (a < 0 || a > 15) {
printf("Error: Zahl liegt nicht zwischen 0 und 15\n");
printf(" Programm beendet...\n");
return 1;
}
printf("Tippe deine zweite Zahl zwischen 0 und 15 ein ");
scanf("%d", &b);
if (b < 0 || b > 15) {
printf("Error: Zahl liegt nicht zwischen 0 und 15\n");
printf(" Programm beendet...\n");
return 1;
}
printf("\n");
int summe = a + b;
int uebertrag = ((a & b) | ((a ^ b) & (a ^ (a + b)))) | ((a == b) & ((a + b) == 15));
printf(" ");
printBinary(a, 5);
printf(" (x)\n");
printf("+ ");
printBinary(b, 5);
printf(" (y)\n");
printf("U ");
printBinary(uebertrag, 5);
printf(" (Uebertrag)\n");
printf("-------------------\n");
printf("+ ");
printBinary(summe, 5);
printf(" (x + y)\n");
return 0;
}
Leider hat es immernoch nicht den richtigen übertrag angezeigt. Ich bin gespannt auf deine Lösung. Wie gesagt vorgabe war mit >>, << zu arbeiten. Angeblich wäre das die einfachste Lösung
Mit deinem Code würde jetzt bei den Zahlen 7 und 12 der Übertrag : 00100 erscheinen. Bei z.B. 15 und 8 kommt dann 01000 obwohl es eigentlich 10000 sein müsste. Kann man dem irgendwie vorbeugen ? Ich wäre auch interessiert an deiner Lösung, wie du es umschreiben würdest, sofern du Zeit und Lust hast. Erstmal Danke für den Hinweis beim Übertrag