Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Seltsam...

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.06.2003, 21:12 Uhr
~0xdeadbeef
Gast


Moin,

Ich hab grad mal C-Golf mit den ror- und rol-Funktionen, die virtual vor einiger Zeit mal als Rätsel gestellt hat gespielt. Die Funktion sollte eine gegebene Zahl um eine gegebene Anzahl bits nach links bzw. Rechts verschieben. Der Code sieht so aus:

C++:
ror(a,b){return a<<b|a>>32-b;}
rol(a,b){return a>>b|a<<32-b;}

void print_bitwise(int a) {
    int i=32;
    while(i--) putchar(a>>i&1|48);
    printf("\n");
}

main() {
    int a = 0xdeadbeef;
    print_bitwise(a);
    print_bitwise(ror(a,2));
    print_bitwise(rol(a,2));
}


Das interessante ist - rol funktioniert, ror nicht. Die Ausgabe des Programms ist:

Code:
11011110101011011011111011101111
11111111111111111111111111111111
11110111101010110110111110111011


Ich würde lügen, wenn ich sagen würde, dass ich wüsste, woran das liegt. Sieht jemand von euch meinen Fehler?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.06.2003, 21:14 Uhr
~0xdeadbeef
Gast


Interessant ist auch, dass es geht, wenn ich statt 0xdeadbeef 123 angebe. Dann sieht die Ausgabe so aus:

Code:
00000000000000000000000001111011
00000000000000000000000111101100
11000000000000000000000000011110

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.06.2003, 21:21 Uhr
~Bon
Gast


Kann es sein, das 0xdeadbeef eine negative Zahl ist,
und deshalb beim rechtsschieben immer eine 1 ins MSB geschoben wird ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.06.2003, 21:43 Uhr
virtual
Sexiest Bit alive
(Operator)


@Bon
Ja, dem ist so. >> für negative Zahlen zieht immer das Signed bit mit (wenn die Rechnerarchitektur soawas hat) und daher sollte man immer casten bzw, mit unsigned rechnen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.06.2003, 12:53 Uhr
~0xdeadbeef
Gast


Bah...wie mach ich das den dann? Irgendwie sowas...

C++:
#define M(x,y) (x<0?-(-x>>y):x>>y)
ror(a,b){return a<<b|M(a,32-b);}
rol(a,b){return M(a,b)|a<<32-b;}


Na egal, ist auch nicht soo wichtig. Trotzdem, gut zu wissen, das mit dem signed bit...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
17.06.2003, 12:56 Uhr
ao

(Operator)



Zitat:
~0xdeadbeef postete
Bah...wie mach ich das den dann?

Natürlich mit unsigned int anstelle von int.
ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
17.06.2003, 13:00 Uhr
~0xdeadbeef
Gast


Aber unsigned ist so lang...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
17.06.2003, 13:02 Uhr
~0xdeadbeef
Gast


Na gut, dann halt so.

C++:
ror(a,b)unsigned a;{return a<<b|a>>32-b;}
rol(a,b)unsigned a;{return a>>b|a<<32-b;}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: