Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » mal wieder bitweise

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 <
000
17.10.2006, 15:59 Uhr
flappinski



Sorry, aber ich bin mit den entsprechenden Such-Tools nicht weitergekommen....
Ich habe folgendes Problem: Ich habe ungeheure Datenmengen , die jedoch SEHR einfach gestrickt sind: Sie bestehen nur aus 0,1,2 und fehlend. Im Moment ist das Speicherformat 0<TAB>1<TAB><TAB>2 etc. Das heisst ich verbrauche für 4 Dateninhalte 8 Byte. Jetzt sind die gespeicherten Dateien in diesem Format teilweise 500 MB bis einige GB gross!!! Von meinem Verständnis könnte ich ja einen Dateninhatl in 2 Bits unterbekommen:
0 -> 00
1 -> 01
2 -> 10
NA -> 11
Wenn ich das jetzt ohne diese blöden TABs hintereinander wegschreibe, bekomme ich plötzlich 4 Dateninhalte in ein Byte! Also sind die Dateien nur noch ein Achtel so gross. Ich erwarte unter anderem dadurch einen Performance-Schub, da alleine das Einlesen der Dateien schon spürbar zeit braucht!
Nun bin ich auf dem Gebiet der Bitoperationen (das brauche ich doch hierfür. oder ?) eine totale Null, will aber zu einer Eins werden (was anderes bleibt mir da ja auch nicht übrig). Vielleicht kann sich jemand erbarmen und mit einen Link schicken, mit dem ich was anfangen kann, bis jetzt bin ich noch nicht wirklich weitergekommen. Nur soviel:
Ich kann mir vorstellen, einen Dateninhalt in 2 Bits umzuwandeln und dann nach links zu verchieben. Wie kann ich denn dann die jetzt die 2 rechts liegenden Bits mit einem neuen Dateninhalt belegen?
Vielen Dank für Eure Hilfe,
Stephan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.10.2006, 16:31 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi, würde sagen 1Byte pro Datensatz vereinfacht die sache, wird insgesamt ja dann trotzdem um einiges kleiner, außerdem habt ihr ggf weitere möglichkeiten das programm auszubauen.

Ansonsten evtl so (ungetestet)


C++:
unsigned char datensatz1 = 0x00; // dein  0, Bits 0000 0000
unsigned char datensatz2 = 0x01; // dein  1, Bits 0000 0001
unsigned char datensatz3 = 0x02; // dein  2, Bits 0000 0010
unsigned char datensatz4 = 0x03; // dein NA, Bits 0000 0011

unsigned char databyte = 0;
databyte = (datensatz1 & 0x03) << 64; // sollte das auf xx00 0000 schieben



Rest analog
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.10.2006, 16:40 Uhr
flappinski



das ist schon ziemlich genau das, was ich meine, nur wie bekomme ich jetzt den zweiten Datensatz auf databyte, ohne dass der erste rechts runterfällt(?). Oder mache ich einen Denkfehler?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.10.2006, 16:49 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja kannst ja einfach so machen:



C++:
databyte |= (datensatz2 & 0x03) << 32;



das fügt zum bestehenden die auf 00xx 0000 geschobenen 2 Bytes hinzu (durch das "oder")
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.10.2006, 16:56 Uhr
flappinski



klingt gut! melde mich, ob es klappt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


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: