Hallo,
ich habe in einem Programm die Bitrotation verwendet, mit zwei Implementierungs-Alternativen:
rotl scheint richtig zu funktionieren, aber rotl2 nicht. Nach etwas Probieren habe ich das Problem auf folgendes reduziert:
Dieser Code gibt seltsamerweise 0 aus!
Liegt das an einem Fehler des Compilers (MS Visual Studio 2008, Ver. 9.0.30729.1 SP), oder ist vielleicht das Resultat der Verschiebung implementierungsabhängig, wenn der Wert des rechten Operanden nicht im Bereich 0 .. 31 ist? Soviel ich weiß, wird der rechte Operand immer modulo 32 genommen (oder genauer: modulo der Bitlänge des linken Operanden) und es müsste hier also um 17 nach rechts geschoben werden...
Ich habe jetzt auch die Funktionen _rotl und _rotr in stdlib.h gefunden, die man für diesen Zweck verwenden kann, aber ich wüsste trotzdem gern, warum dieses a >> -b nicht wie gedacht funktioniert.
ich habe in einem Programm die Bitrotation verwendet, mit zwei Implementierungs-Alternativen:
Code:
inline unsigned rotl (unsigned a, unsigned b) { return a << b | a >> 32-b; } inline unsigned rotl2 (unsigned a, unsigned b) { return a << b | a >> -b; }
Code:
cout << (215428749u >> -15u) << endl;
Liegt das an einem Fehler des Compilers (MS Visual Studio 2008, Ver. 9.0.30729.1 SP), oder ist vielleicht das Resultat der Verschiebung implementierungsabhängig, wenn der Wert des rechten Operanden nicht im Bereich 0 .. 31 ist? Soviel ich weiß, wird der rechte Operand immer modulo 32 genommen (oder genauer: modulo der Bitlänge des linken Operanden) und es müsste hier also um 17 nach rechts geschoben werden...
Ich habe jetzt auch die Funktionen _rotl und _rotr in stdlib.h gefunden, die man für diesen Zweck verwenden kann, aber ich wüsste trotzdem gern, warum dieses a >> -b nicht wie gedacht funktioniert.
Comment