bitweise kopieren
-
Hallo Leute ich habe hier ein kleines Problem vielleicht könnt ihr mir weiter helfen.
Ich muss verschiedene Variablen bitweise hintereinander zusammenführen bei 8 Bit länge mach ich das im Moment so:
BYTE erg[256] ={0}; int a = 2;//= 10 int pos1 = 0; int b = 8;//= 1000 int pos2 = 2; erg[pos1/8] = erg[pos1/8] | a << pos1; erg[pos2/8] = erg[pos2/8] | b << pos2; //erg[0] ist ab jetzt 100010
Das funktioniert soweit ganz gut so lange die Werte in den Variablen nicht länger als 8Bit sind.
Jetzt kann es natürlich sein das die Werte länger als 8Bit oder es sogar ein String ist. Ein Möglichkeit wäre es ja das ganze mit schleifen zu lösen oder gibt es da auch eine einfachere Möglichkeit?
-
Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x, bzw. C++11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Dein Code stimmt so nicht. Da sollte 1010 rauskommen, da du b nicht shiftest. Natürlich musst du für Arrays Schleifen verwenden. Was denn sonst?
-
Was genau soll das werden? Das klingt nach einer komplizierten Lösung für ein Problem, welches wahrscheinlich gar keines ist.
-
Danke für die erstmal Antworten.
wxSkip also bei mir kommt hex 0x22 raus was 100010 entspricht.
Im Debuger sieht das ganze so aus
erg[pos1/8] = erg[pos1/8] | a << pos1;
//erg[0] ist 0x02 = Binear 10
erg[pos2/8] = erg[pos2/8] | b << pos2;
//erg[0] ist 0x22 = Binear 100010SeppJ was im Hintergrund passiert kann ich auch nicht genau sagen. Ich bekomme x Variablen und die Start Position des ersten bits der jeweiligen Variable.
Nun muss dass ganze entsprechend der Bitpostition zusammengeschoben werden und soll später als Bytepointer zurückgegeben werden. Wobei der Datentyp der Variablen unterschiedlich sein kann.
-
Sorry, ich hab was übersehen.
Kannst du sagen, in welcher Form du die Variablen und die Positionen bekommst? Du musst wahrscheinlich eine Funktion schreiben, nehme ich an.
-
Grundsätzlich bekomme ich den Wert als String, den Datentyp, die Startpostition des Wertes und die bitlänge des Wertes.
-
Wie darf man sich das mit dem Datentyp vorstellen? Warum schreibst du nicht einfach eine Funktion, die alle numerischen Typen in long long konvertiert und der "Generalfunktion" übergibt und eine andere für Strings? Und wo bekommst du die anderen Werte her?
-
Das Problem ist unterspezifiziert (oder ich habe etwas übersehen).
Soweit ich das verstanden habe, willst Du (Davi) der OP beliebige Daten (Zahlen, Zeichenketten) in ein Byte-Array an "einer beliebigen Bitposition" schreiben können. Aber wie genau, ist nicht klar; denn da gibt es mehrere Möglichkeiten. Am populärsten (in Sachen Datenkompression) ist sicherlich eine "most significant bit first"-Ordnung. Also:
| Bit | 7 6 5 4 3 2 1 0 --------+---------------- octet 0 | a b c d e f g h (most significant bit first) octet 1 | i j k l m n o p … | …
Einen 10-Bit-Wert von 31 gefolgt von einem 4-Bit-Wert von 5 würde man so verpacken:
| Bit | 7 6 5 4 3 2 1 0 --------+---------------- octet 0 | 0 0 0 0 0 1 1 1 (most significant bit first) | +-------+--- octet 1 | 1 1|0 1 0 1|. . … | ---+-------+ …
dass da also die Sequenz 0x07, 0xD? rauskommt.
Fast jedes Kompressionsformat nutzt diese Ordnung.
Bevor ich da Vorschläge mache, wie man das angeht, würde ich gerne wissen, ob ich die Frage richtig verstanden habe. Am besten gibst Du uns mal ein Beispiel mit gewünschtem Ergebnis.