Bit Verschiebung
-
Danke für dein Antwor, das habe ich mir auch gedacht und schon ausprobiert, aber es funktioniert leider nicht
also wenn man es mit Das wert in Foo = 1 ist dann ja wenn aber das wert z.B. 0xababab1 sein sollte dann funktioniert es leider nicht
-
borhany schrieb:
also 33 Bit.
Nein, 3*8+1 sind 25 Bit. Und 0xababab1 ist breiter als 25 Bit, dementsprechend kann der Shift bei Verwendung eines 32-Bit-Typs nicht klappen.
-
stimmt, dumm von mir habe es mit
crc32 = 0xababab1<<7; unsigned char bar[5]={(crc32 >> 32) & 0xFF, (crc32 >> 24) & 0xFF , (crc32 >> 16) & 0xFF, (crc32 >> 8) & 0xFF, (crc32 >> 0) & 0xFF };probiert funktioniert immer leider noch nicht
-
Wenn schon, dann:
char foo[8]; *reinterpret_cast<uint64_t*>(foo)=0xbababa1; *reinterpret_cast<uint64_t*>(foo) <<= 7;
-
borhany schrieb:
ich habe ein unsigned char bar [4]
ok soweit
borhany schrieb:
und da ist ein Wert gespeichert, die vier drei Byte und ein Bit lang ist also 33 Bit.
Wieviel Bytes und Bits? Wie?borhany schrieb:
Nun möchte ich das das wert um sieben stellen nach links verschoben wird also sozusagen bar = bar <<7
Was heißt denn das? Beschreib mal, gib Beispiele, mal's auf in einem code-block. Wie ordnest Du die Bits an?
Wofür braucht man das? Könnte mir vorstellen, dass Du einfach nur zu kompliziert denkst.
-
Sorry, ich meinte 33Bit ist richtig also $ BYte und ein Bit
wieso unsigned char foo [8]
in fünf Byte müsste doch das wert auch passen. oder stört unsigned
-
Der nächstgrößte Datentyp nach 32 Bit ist bei meinem Compiler eben 64 Bit, deswegen 8 Bytes. Wenn dein Compiler 40 Bit-Typen unterstützt, kannst du natürlich auch die nehmen.
-
Man könnte natürlich auch einfach rechnen, dann wäre es auch portabel.
-
Mit rechnen habe ich es ausprobiert. Also bei kleinen Werten muss ich es mal 128 und bei großen 128. Ich weiss immer noch nicht wo mein fehler liegt
Das kann ja so nicht richtig sein
-
borhany schrieb:
Mit rechnen habe ich es ausprobiert. Also bei kleinen Werten muss ich es mal 128 und bei großen 128. Ich weiss immer noch nicht wo mein fehler liegt
Das kann ja so nicht richtig seinIch verstehe den Satz nicht, in dem du beschreibst, was du gemacht hast.
Grob gesagt muss man bei einem 8 Bit char: Den ersten char 7 Bits nach links verschieben. Vom zweiten char die 7 höchstwertigen Bits nehmen. Diese um 1 Bit nach rechts schieben. Das Ergebnis mit dem verschobenem ersten char logisch & verknüpfen.
Genauso fortfahren mit dem zweiten char.Das kann man natürlich auch für chars, die nicht 8 Bits haben, verallgemeinern. In <limits> steht drin, wie viele Bits ein char hat. Möglicherweise kann man das auch nochmal vereinfachen, aber so müsste das auf jeden Fall gehen.
-
borhany schrieb:
...Ich weiss immer noch nicht wo mein fehler liegt...
Der Fehler liegt darin, dass Du Deine Postings nicht noch einmal durchliest, bevor Du sie abschickst. Ist nicht böse gemeint, aber um helfen zu können, muss man schon verstehen was Du genau willst. Mit halbfertigen Satzfragmenten ohne Punkt und Komma ist das allerdings schwierig.
-
borhany schrieb:
Mit rechnen habe ich es ausprobiert. Also bei kleinen Werten muss ich es mal 128 und bei großen 128. Ich weiss immer noch nicht wo mein fehler liegt
Das kann ja so nicht richtig seinBahnhof.
Du hast es immer noch nicht geschafft zu beschreiben, was Du eigentlich willst. Viel zu wenig Information von Deiner Seite aus! Shit in, shit out! Wenn Du Deine Frage nicht präzise formulierst, wirst Du einen großen Anteil an Antworten mit Code bekommen, der nicht das macht, was Du willst.
borhany schrieb:
sozusagen bar = bar << 7
Der Shift-Operator ist natürlich nicht auf Arrays definiert, nur auf Ganzzahltypen. Und bei Ganzzahltypen ist klar, was sie machen. Du versuchst hier zu beschreiben, was Du willst, lässt aber ein entscheidendes Detail weg. Du reduzierst ein "Array shift" auf ein "Ganzzahl shift", verrätst aber nicht wie man von dem char[] zu einer Ganzzahl kommt und dann wieder zurück. Stichwort: Byte-Ordnung.
Gruß,
SP
-
borhany schrieb:
habe es mit
crc32 = 0xababab1<<7; unsigned char bar[5]={(crc32 >> 32) & 0xFF, (crc32 >> 24) & 0xFF , (crc32 >> 16) & 0xFF, (crc32 >> 8) & 0xFF, (crc32 >> 0) & 0xFF };probiert, funktioniert immer leider noch nicht
Was funktioniert da nicht?! Inwiefern unterscheidet sich das Ergebnis von dem, was Du haben willst? Ich kann zumindest nicht hellsehen.
Wenn Du Hilfe willst, musst Du Dir schon mehr Mühe geben! Vielleicht solltest Du auch mehr von dem drumherum verraten, also, warum Du glaubst, so etwas machen zu müssen. Wenn Du eine CRC-Prüfsumme berechnen willst: Das geht auch viel eleganter.
Gruß,
SP