u8 Array in u64



  • Hallo,

    ich habe ein Array arr[8] voll mit u8 Werten. Also ein Array mit 8x1Byte.

    Diese möchte ich nun in einen u64 Datentyp zusammenführen. Also immer um 8 Bit verschoben.

    Ich komme damit noch nicht zurecht. Ich weis das man mit dem Operator >> nach rechts verschieben kann.

    Eigentlich möchte ich das ganze dann im Anschluss bit-weise verarbeiten.

    Zum Beispiel die dann zusammengehängten 64 Bit (z.B. "0010 1100 ...") mit einer Maske "AND" schalten und das Ergebnis verschieben (z.B: "... 1100 0000" ---> "... 1100").

    Ich weis noch nicht genau wie ich dass dann mache, nachdem ich die 64 Bit Zahl habe, da diese ja nicht im Bit-Format gespeichert ist (wie z.b. in einem String). Eine Dezimalzahl kann ich mittels 2^(-x) nach rechts verschieben. Aber wie lege ich einen Maske drüber... und so weiter.

    Mir ist das arbeiten damit also noch nicht ganz klar, vielleicht kann mir da jemand weiterhelfen 🙂

    Gruß


  • Mod

    JohnDillinger schrieb:

    Ich komme damit noch nicht zurecht. Ich weis das man mit dem Operator >> nach rechts verschieben kann.

    Möchtest du nicht eher nach links verschieben?

    Ich weis noch nicht genau wie ich dass dann mache, nachdem ich die 64 Bit Zahl habe, da diese ja nicht im Bit-Format gespeichert ist (wie z.b. in einem String). Eine Dezimalzahl kann ich mittels 2^(-x) nach rechts verschieben. Aber wie lege ich einen Maske drüber... und so weiter.

    Bitweises OR: |
    Bitweises AND: &
    Bitweises XOR: ^
    Bitweises NOT: ~
    Bitweiser Linksshift: <<
    Bitweiser Rechtsshift: >>

    Natürlich auch jeweils wie gewohnt mit einer Zuweisung kombinierbar, also |=, &=, ^=, <<= und >>=. (Bei ~ macht das natürlich herzlich wenig Sinn, daher gibt es das nicht)



  • Hallo,

    danke dir.

    ich mache es mal ein wenig übersichtlichter:

    Punkt 1: u8 Array in u64 Datentyp verschieben
    ?

    Punkt 2: AND Maske drüber legen
    Ok ich benutzte den & Operator. Aber was verbinde ich hier? Die dezimalzahlen der u64 Zahl und der Maske?

    Punkt 3:verschieben
    mit dem >> oder << Operator. Auch hier, welche Variable benutzte ich und wie schaut das aus?
    ich nehme ja nicht den Dezimalwert davon, den würde ich ja, wie gesagt mit 2^x verschieben.

    Gruß


  • Mod

    Das ist alles Rechnen. Spezielle Darstellungssysteme für Zahlen sind dabei irrelevant. 2+2 ist immer 4, egal ob du dafür 0b10 + 0b10 = 0b100 oder 0x2 + 0x2 = 0x4 oder II + II = IV schreibst. Ebenso ist 2 << 2 immer 8, egal wie du es aufschreibst. Die Zahlen stehen im Computer sowieso nicht binär, dezimal oder sonstwie, es sind einfach nur Zahlen*.

    Punkt 1: u8 Array in u64 Datentyp verschieben

    Die Elemente mit dem kleinsten Index sollen die höchstwertigsten Bytes darstellen, oder? Dann beispielsweise (ungetestet)

    uint64_t result = 0;
    for(int i = 0; i < 8; ++i)
      result += u8[i] << 56 - i*8;
    

    Punkt 2: AND Maske drüber legen
    Ok ich benutzte den & Operator. Aber was verbinde ich hier? Die dezimalzahlen der u64 Zahl und der Maske?

    Zahlensysteme sind irrelevant! Einfach deine Zahl mit der Maske verUNDen. Das Ergebnis ist immer das gleiche, egal wie du deine Zahlen aufschreibst.

    *: Zumindest auf der Ebene, auf der du als Softwareentwickler arbeitest. Wenn du dir ein eigenes Addierwerk aus Transistoren und Kondensatoren zusammen lötest, dann wirst du dabei die Zahlen schon irgendwie physisch darstellen müssen.



  • Ich würde die Schleife eher so schreiben

    uint64_t result = 0;
    for(int i = 0; i < 8; ++i)
    {
      result <<= 8;
      result |= u8[i];
    }
    

    Ist m.E. einfacher zu verstehen.



  • Th69 schrieb:

    Ich würde die Schleife eher so schreiben

    uint64_t result = 0;
    for(int i = 0; i < 8; ++i)
    {
      result <<= 8;
      result |= u8[i];
    }
    

    Ist m.E. einfacher zu verstehen.

    Danke deine Lösung hat das richtige ausgegeben.

    Bei der Lösung von SeppJ kommt bei mir irgendwie was anderes raus.


Log in to reply