Bit Verschiebung



  • 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.


  • Mod

    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


  • Mod

    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 sein

    Ich 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 sein

    Bahnhof.

    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


Anmelden zum Antworten