Frage zu Bitoperationen

fireblade1282

Mitglied
Servus Leute!
Frage zu Bitoperationen in ganz normalem ANSI C, wird aber denke ich mal bei allen anderen C's ebenso sein sein.

Hintergrund:
Ich habe in einem reservierten Speicherbereich riesige Mengen von medizinischen CT Daten. Da mich im aktuellen Kontext nur ja/nein Werte interessieren arbeite ich auf Bit Ebene. Je nachdem wieviele Datensätze ich in den speicherbereich legen will, reserviere ich ihn als char, short oder long. Der erste Datensatz wir mit dem ersten Bit usw abgelegt. Die Bits setze ich ganz normal mit z.B.

char i = (char) 0x01;
short s = (short) 0x0001;
long l = (long) 0x00000001;

Die sorgen jeweils alle dafür, dass exakt das letzte bit gesetzt ist, soweit easy.
Mitlerweile benötigt die Anwendung aber teilweise mehr als 32 CT Datensätze im Speicher, ich habe also nun den double mit eingeführt. Jetzt habe ich aber folgendes Problem, zu dem ich noch nichts gefunden habe:

Eigentliche Frage:
Bewirkt
double d = (double) 0x0000000000000001;
dass das erste o. letzte Bit (je mnach Byteorder o.ä.) gesetzt ist?

Bedenken:
Mein gesunder Verstand warnt mich das so ein zu coden, da ja Fließkommazahlen mit signum, mantisse und exponent intern gespeichert werden. 0x00...0001 ist ja aber für den Compiler eine Konstante, die den Wert 1 ausdrückt, der wird ja dann sicher intern als +1e1 oder sowas gespeichert und das gibt Bitsalat - hab ich recht? Oder bewirkt das doch das was ich will.
Im Endeffekt will ich ja einfach nur einen 8Byte Block bitweise ansprechen (Ja - ANSI C auf einer AIX Maschine, auf dem Zielsystem sind es also wirklich 8 Bytes für den double, bitte keine Threads zu DEM Topic :o)

Kann mir hier jemand was schlaues zu sagen? Bin für jeden Hint dankbar, fand in einschlägigen Literaturen und Google immer nur Bitoperationen für Integertypen...

Danke
 
... wenn das Programm nicht schon 10 Jahre alt wäre und ich die original definitionen des CT's ändern könnte :)
Die Basisstruktur ist vorgegeben. short, int, long, float, double sind möglich und können vom System erzeugt werden, damit muss ich leider klar kommen. Ist es denn möglich Fließkommazahlen sinnvoll mit Bitoperationen zu bearbeiten?

Trotzdem schon mal danke! Hat jemand weitere Ideen?
 
Hey - ich habe eine Idee:
Ich baue meine Bits im double jetzt so:

double d;
long long int *plli;
plli = &d;
*plli = 0x0000000000000001;

Aber lasst mich raten. Dass sizeof(double) == sizeof(long long int) ist, muss nicht immer so sein, right?
Kommentarer zu diesem Topic sind immer noch gerne erwünscht
 
Sers,

was sheel als __int64 meinte is normalerweise nurn typedef auf long long, das int brauchst du normalerweise nimmer angeben. Aber bei eina alten kiste könnt des scho sein, falls die keine IA32 sein sollte.

I bin mir grad net sicher ob des was du da überhaupt nen unterschied zu der direkten zuweisung macht. Das hauptproblem wird dann eben sein, das du die komplette syntax schreiben müsstest...vorzeichen, exponent und mantisse..
 
__int64 wird als long long interpretiert

den wert, den du einer variable zuweist, wird auch als solcher binär gespeichert..
0x01 ist und wird immer 0x01 bleiben... die interpretation dieser werte(multiplikation, division oder auch addieren, subtrahieren, mit vorzeichen oder ohne) ist natürlich abhängig vom datentyp.. so lassen sich problemlos alle werte auch in einem double speichern und abrufen, sofern sie nicht die breite von 64bit überschreiten... die typen sind natürlich, wie schon festgestellt wurde, system abhängig... in der sprache C ist nicht vorgeschrieben wie groß ein datentyp zu sein hat, nur welcher größer oder kleiner als der andere sein soll

allerdings ist 0x01 keine dualzahl sondern eine hexadezimalzahl, deswegen versteh ich nicht ganz was du mit "bitzuweisung" meinst.. und diese ganzen nullen kannst du dir auch sparen, dient natürlich der übersicht... aber wenn du eh nur alles auf 1 oder 0 setzten willst....
 
Zuletzt bearbeitet:
Zurück