Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Dualzahlen Addieren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
01.10.2004, 17:19 Uhr
RedEagle



Tach. Ich möchte 2 (8 Bit große) Dualzahlen Addieren, allerdings nur mit Logischen opperationen (AND, OR, XOR)

Leider wird nicht immer richtig addiert (nur manchmal).

Der Header mit den Opperatoren:

C++:
bool AND(bool Bit1, bool Bit2)
{
return Bit1 && Bit2;
}

//---

bool OR(bool Bit1, bool Bit2)
{
return Bit1 || Bit2;
}

//---

bool XOR(bool Bit1, bool Bit2)
{
return Bit1 ^ Bit2;
}



Ich hoffe und denke mal, das das richtig ist.

Und jetzt die Funktion der addition:

C++:
bool add(bool bit1, bool bit2, bool ubergabe)
{
bool erg;

  erg      = XOR(ubergabe, XOR(bit1, bit2));
  ubergabe = OR(AND(XOR(bit1, bit2), ubergabe), AND(bit1, bit2));

static int durchlauf=0;
  if(erg) ergebniss[durchlauf] = '1';
  else    ergebniss[durchlauf] = '0';
durchlauf++;
return ubergabe;
}

/*
ergebniss ist ein char-array


Die funktion wird in einer schleife ausgerufen:
*/


//...
for(i=0; i<=9; i++)
   {
    ubergabe = add(Byte1[i], Byte2[i], ubergabe);
   }
//...



Wo liegt der Fehler (die Berechnung von ubergabe und erg habe ich als logische schaltung aus'm internet, und habe sie mit "Electronic DigSi 1.0" getestet, und hoffentlich richtig übernommen.
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.10.2004, 20:35 Uhr
Hans
Library Walker
(Operator)


Hi RedEagle,

bei der Addition auf Bitebene sind zwei Dinge zu beachten: da gibt es zuerst einmal den Halbaddierer und den Volladdierer. Der Unterschied zwischen beiden besteht darin, dass der Halbaddierer einen möglichen Übertrag nicht berücksichtigt. Das tut nur der Volladdierer.
Um so eine Addition auf Bitebene durchzuführen, musst Du Dich mit diesen Überträgen "herum schlagen". Damit alles richtig läuft, musst Du die Nuller-bits (Wertigkeit 2 hoch 0) mit einem Halbaddierer bearbeiten, und die weiteren Stellen jeweils mit einem Volladdierer. Dabei also die Reihenfolge beachten: Mit den niederwertigen Bits anfangen, und von dort zu den höherwertigen gehen. Und: die Überträge berücksichtigen! Du hast also immer zwei Ergebnisse: einmal das Ergebniss der Rechnung selbst, (XOR-Verknüfpung) und einmal den Übertrag (UND-Verknüpfung). Beide brauchst Du für die nachfolgende Rechnung.
Wenn Du ein bisschen Ahnung von Digitaltechnik hast, dann schau Dir mal die Logikschaltungen an, die sich Halb- bzw. Volladdierer nennen, und wie die zusammengeschaltet werden, wenn mehrere Bits verarbeitet werden sollen. Dann rechne ruhig mal ein paar Aufgaben auf Papier nach. Das fördert das Verständniss meiner Meinung nach am meissten. Danach kannst Du Dir die Funktionen so bauen wie Du sie haben willst. - Da fällt mir gerade mal so auf: Wenn man das mit ganzen chars oder Integern macht, kann man sich damit Routinen für beliebieg grosse Zahlen basteln. (Aus Portabilitätsgründen wären da aber die char's vorzuziehen, weil die auf jedem System 8 bit haben, während integer zwischen 8 und derzeit 64 Bit gross sein koennen.)

Hans

P.S. Die Beste Einführung zum Thema Digitaltechnik die ich kenne:

--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 01.10.2004 um 20:39 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.10.2004, 20:42 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


www.fun-soft.de/showtopic.php?threadid=8092&time=1095613089
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 01.10.2004 um 20:43 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.10.2004, 20:58 Uhr
Hans
Library Walker
(Operator)


Ups! - Den kannte ich ja noch gar nicht...

Naja, hab aber auch schon seit Wochen nicht mehr in die Rätselecke gelinst...

Hans


P.S. ich war aber trotzdem schneller.
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.10.2004, 21:04 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


dafür liegt in der kürze die würze
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.10.2004, 09:35 Uhr
RedEagle



Was evtl auch interessant währe:
Ich habe die reihenfolge verdreht:

2^0 dann 2^1 dann 2^3 anstatt
2^3 dann 2^1 dann 2^1

Also: 2=01 und nicht wie üblich 10
das habe ich natürlich berücksichtigt.

---

Ich kann doch auch 2^0 mit dem Volladdierer berechnen, wenn ich als Übertrag "0" angebe, oder?? (War nicht im Codeabschnit zu erkennen)
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.10.2004, 09:51 Uhr
RedEagle



Aus irgend nem Grund Funktionierts jetzt (Habe nen überall nen bischen rumgefummelt )

Lag es evtl, dass ich


C++:
  bool Byte1[9];
  bool Byte2[9];

//anstatt

  bool Byte1[9] = {false,false,false,false,false,false,false,false};
  bool Byte2[9] = {false,false,false,false,false,false,false,false};


verwendet habe??
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
02.10.2004, 11:34 Uhr
(un)wissender
Niveauwart


Dort sind nur acht Einträge, nicht neun.
Kannst auch mit dem Bitset arbeiten, wäre wohl besser.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
02.10.2004, 11:37 Uhr
RedEagle



oh, verzählt

Was ist "Bitset" ??
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
02.10.2004, 11:55 Uhr
Hans
Library Walker
(Operator)



Zitat von RedEagle:
Was evtl auch interessant währe:
Ich habe die reihenfolge verdreht:

2^0 dann 2^1 dann 2^3 anstatt
2^3 dann 2^1 dann 2^1


Moment moment! - Deine zuerst genannte Reihenfolge ist schon richtig. Aber zwischendurch darfst Du 2^2 nicht vergessen


Zitat:

Ich kann doch auch 2^0 mit dem Volladdierer berechnen, wenn ich als Übertrag "0" angebe, oder?? (War nicht im Codeabschnit zu erkennen)

Ja, das kannst Du machen.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: