Echte Bit Rotation NICHT Bit Shift Left/Right.



  • Ich will entweder ein unsigned long int oder ein double oder was anderes der Grösse mind. 4 Byte (2^32 Zustände, besser 8 Byte 2^64 Zustände) bitrotieren.

    Und wenn ich sage bitrotieren mein ich das auch, denn erschräckernderweise habe festgestellt,
    dass viele C++ Beginner Tutorials da voneinander abschreiben, und obendrein nicht mal den unterschied zw. shift und rotation verstehen. Das ärgert mich total.

    Die operatoren "<<" und ">>" stehen jedenfalls für shifts,
    ich habe irgendwo gelesen, dass in C++ "^<" und "^>" für echte bitrotation links/rechts steht,
    aber mein MinGWStudio erkennt das nicht, oder es sind spezielle header vorrausgesetzt,
    die intelligenterweise im tutorial nicht mit angegeben sind.

    ich hoffe ihr versteht meine frustration,
    aber weis denn irgendjemand wie man grössere datentypen ab 4 Byte bit rotiert ???

    Danke im vorraus.



  • PS: wieso wird das wort V O R R A U S zensiert ?

    ist doch nur falsch geschrieben, ich meinte natürlich:
    Danke im voraus.



  • Schau dir mal rotate() aus <algorithm> an.



  • kannst du das bitte ein bisschen genauer beschreiben ?
    wenn ich #include <algorithm> hizufüge findet der trotzdem keine "rotate" prozedur...




  • Mod

    rotation kanns du leicht aus << und >> zusammensetzen:

    unsigned rot(unsigned v, int c) { return v << c | v >> sizeof( v ) * CHAR_BIT - c; }
    

    analog für andere typen, die << und >> im sinne von bitshift implementieren (z.b. bitset)

    std::rotate kann man auch einsetzen, vorausgesetzt man hat geeignete iteratoren.



  • camper schrieb:

    rotation kanns du leicht aus << und >> zusammensetzen:

    unsigned rot(unsigned v, int c) { return v << c | v >> sizeof( v ) * CHAR_BIT - c; }
    

    analog für andere typen, die << und >> im sinne von bitshift implementieren (z.b. bitset)

    std::rotate kann man auch einsetzen, vorausgesetzt man hat geeignete iteratoren.

    das hat mir weitergeholfen, danke.

    leider geht das nur für integer types, also maximal unsigned long int (4 bytes).

    mit double (8 bytes) geht das nicht weil "<<" für double nicht definiert ist,
    ist aber auch egal, weil double für mein verwendungszweck "unlogisch" wäre,
    ich will nämlich nur die 0 und positive zahlen haben.

    in java ist der long int 8 byte.

    wie krieg ich den c++ unsigned long int "länger" ???



  • tobiasbeil schrieb:

    in java ist der long int 8 byte.
    wie krieg ich den c++ unsigned long int "länger" ???

    C++ kann das nicht.
    Manche compiler verstehen aber __int64 oder long long.
    Kurt



  • tobiasbeil schrieb:

    PS: wieso wird das wort V O R R A U S zensiert ?

    ist doch nur falsch geschrieben, ich meinte natürlich:
    Danke im voraus.

    Weil viele Leute es falsch schreiben ohne zu wissen, dass es falsch ist. Das ist sozusagen der Wink mit dem Zaunpfahl.

    Ich finde es viel trauriger, dass die Forenbetreiber Kunstdiskussionen in diesem Forum radikal zensieren. So ist es mir nicht erlaubt, über die berühmte Bildserie des Künstlers A. R. Penck zu reden. 😢



  • tobiasbeil schrieb:

    PS: wieso wird das wort V O R R A U S zensiert ?

    Mit der Vorschaufunktion kann man im νorraus vorraussehen, was zensiert wird.



  • Bei mir gehts: vorraus


Anmelden zum Antworten