2014-01-22 11 views
6

Ich versuche, eine unsigned Char durch 'n' Bits zu drehen. Aber ich bekomme nicht das gewünschte Ergebnis. Dies ist mein CodeDrehung von unsigned Char von n Bits

void left_rotate(unsigned char a, int no){ 
     // no - number of times to rotate 
     printf("%d\n", ((a << no) | (a >> (8-no)))); 
} 

ich diese Funktion von Mail nenne als

unsigned char a = 'A'; 
left_rotate(a, 2); 

ich die folgende Ausgabe

//'A' = 65 = 01000001 
// I am rotating in left direction by two times 
// a << 2 = 00000100 
// a >> 6 = 00000001 
(00000100 | 00000001 = 00000101 = 5 in decimal) 

erwartet folgt Aber ich habe eine andere Ausgabe

// The output in my screen = 100000101 = 261 in decimal 

Wie hat dass 1 in MSB kriechen? Ich verwende ein vorzeichenloses Zeichen als Datentyp. Also sollte es nicht 8 Bits überschreiten. Kann mir bitte jemand das erklären?

Dank

Chid

+0

Sie wechseln in (oder durch) das Vorzeichen eines signierten Typs ('char'). Dies ist ** undefiniertes Verhalten **. Verwenden Sie stattdessen 'unsigned char'. – WhozCraig

+0

@WhozCraig Wo verschiebt er einen signierten "char"? –

+0

@ H2CO3 in meinem Kaffee-entzogenen intellektuell beschlagenen Kopf. Danke, dass du mich ehrlich gehalten hast, Sir = P – WhozCraig

Antwort

10

Da <<-unsigned int seine Argumente fördert, müssen Sie die oberen Bits des Schiebe Ergebnis maskieren:

printf("%d\n", (((a << no) & 0xFF) | (a >> (8-no)))); 

Demo on ideone (druckt 5).

+2

Ich wünschte, ich könnte * all * deine Antworten nur für deinen Avatar pic aktualisieren; eine Rrod. Das ist * hervorragend *. Leider verdient dies ohne weiteres die Abstimmung. – WhozCraig

+0

Danke Jungs für die Antworten – CHID