Multiplikation von zwei 40 Bit Zahlen / C++

D

drummer

Mitglied
Thread Starter
Dabei seit
18.10.2003
Beiträge
52
Reaktionspunkte
1
Hallo,

ich arbeite mit einem Kommilitone an einem Projekt fürs Studium und wir kommen nicht weiter. Wir müssen zwei 40 Bit Zahlen miteinander multiplizieren und das LSB in der einen Variable abspeichern, das MSB in der anderen.

Die 40 Bit Zahlen sind folgendermaßen aufgebaut: 1 Vorzeichenbit, 39 Bit Mantisse, kein Exponent.

Hier kommt die Klassendeklaration dieses Zahlenelementes:

/*
* daten.h
* IAS-Computer
*
* Created by Uwe Keusch and Daniel Roller on 29.04.08.
* Copyright 2008 Hochschule Pforzheim. All rights reserved.
*
*/

class dataElement
{
private:
bool vorzeichen;
long long content;

public:
dataElement();
bool getvorzeichen();
bool getnvorzeichen();
void setvorzeichen(bool);
long long getcontent();
void setcontent(long long);
};

Vielen Dank für eure Antworten!
 
drummer schrieb:
und wir kommen nicht weiter.

wobei/womit kommt ihr nicht weiter?

Das hier ist kein Hausaufgabenlösungsgenerator!

Wieviel Bit sollen denn die MSB/LSB haben? 8,16,32 ??
 
Alex schrieb:
Ich glaube, ein Most Significant Byte (oder LSB) hat immer 8 Bit

wie nannte man das denn dann bei 16Bit-Hardware? LSW/MSW ?
 
Hallo wegus,

das Ergebnis der Multiplikation ist ja eine 80 Bit Zahl. Eigentlich 78 Bit, weil nur 39 Bit zur Mantisse verwendet werden. Und diese 78 Bitzahl soll wieder aufgeteilt werden:

dataElement1.content = MSB
dataElement2.content = LSB

Das Vorzeichen machen wir extra, dass ist dann kein Problem.
 
bleibt meine Ausgangsfrage an welcher Stelle sich Euch welche Frage stellt/ wo ihr nicht wisst!
 
Kan man long double bitweise ansprechen? Das wäre fast schon die Lösung.
 
Ok. Die Bezeichnungen MSB und LSB sind hier falsch! Einfach die ersten 40 Bit und die zweiten 40 Bit.
 
Hallo wegus,

danke für die Antwort.

Bitmanipulationsbefehle kenne ich. Doch die kann ich nicht für floating point Datentypen verwenden.
 
ich seh da nur long als Datentyp! Und man kann doch mit

Code:
if (zahl && 16)
  printf("Bit5 ist gesetzt");
else
 zahl=zahl|16; // Bit 5 setzen

Bits manipulieren ( mein C/C++ ist erheblich angestaubt - bitte nicht auf die Syntax festnageln).
 
long long ja. Aber ich muss das Ergebnis irgendwo abspeichern. Das Ergebnis ist doppelt so groß. Long double würde ausreichen. Doch das ist floatingpoint. Nicht mehr ganzzahig.
 
long long ja. Aber ich muss das Ergebnis irgendwo abspeichern. Das Ergebnis ist doppelt so groß. Long double würde ausreichen. Doch das ist floatingpoint. Nicht mehr ganzzahig.

Dann nimm doch unsigned char[10]; Aber ich dachte doch ohnehin, dass das Ergebnis in zwei long longs soll.

Alex
 
damit das Ganze einen Sinn hat, egal wieviele Stellen Deine "Bytes" haben, muüssen beide Operanden und auch das Resultat MSB/LSB gleicher Länge nutzen! Sprich wenn eine Zahl 40Bit hat, dann besteht das Resultat aus einem 40Bit MSB und einem 40Bit LSB und eben nicht aus einer 80-Bit Einheit!

Außerdem kannst Du Dir ja mittels malloc beliebige Speichermengen reservieren oder wie von Alex gezeigt auf einem Array operieren!
 
Wir sprechen hier intern von MSV und LSV: Most- und Least Significant Value.

Alex
 
Ich denke doch, dass das, was du anspricht wegus, das zu lösende Problem ist:
Du mullst zwei Zahlen und erzeugt eben einen überlauf, der durch das aufteilen in MSV und LSV 'abgefangen' wird.

Und um dieses zu Lösen kann bspw. das Produkt entsprechend aufgespalten werden, sodass eine Menge von Ergebnissen ins MSV und die andere Menge der Ergebnisse ins LSV verteilt wird.
 
genau. ich hätte als Ergebnis eigentlich eine 80 Bit Zahl, teile sie aber in MSV und LSV auf.
 
ja und das macht man durch schrittweises ( binäres) addieren mit Übertrag ! :)
 
Hm, wie wäre es mit einer verketteten Liste? Damit läufst du garantiert in keine Limits...
 
Zurück
Oben Unten