2017-11-14 1 views
-2

Ich habe ein wenig Mühe, meinen Code zu schreiben, um meine hexadezimalen Ziffern nach rechts zu drehen. Unten ist eine Funktion, die ich geschrieben habe, wo, wenn Sie es aufrufen, es so übergibt: rotr (0x12345678, 4), sollte es 0x81234567 zurückgeben. Stattdessen gibt es nur 7 Ziffern zurück (im Gegensatz zu acht, wie im ursprünglichen Wert = 0x12345678).C - Ich habe Probleme beim Kodieren einer "rechtsdrehend" -Funktion

Kann mir bitte jemand helfen zu verstehen, was in der Bit-Ebene vor sich geht? Ich habe Probleme zu verstehen, warum mein aktueller Code 0x123456f anstelle von 0x81234567 zurückgibt. Danke im Voraus!

Edit: ist es, weil ich 0x12345678 zu früh verschiebe? Ich versuche hauptsächlich herauszufinden, warum nur sieben Ziffern zurückkommen, im Gegensatz zu acht.

unsigned int rotr(unsigned int x, int n) { 
    int i; //iterate for loop 
    unsigned int y; //masked last bit 
    unsigned int z; //final result 

    for (i=1; i<=n; i++) { 
     y = x & 0x1; //isolates last bit 
     x = x >> 1; //shift right 1 
     z = x | (y << (sizeof(x)-1)); //shifts mask back to first slot; OR 
             //it with x 
    } 

    return z; 
} 
+1

'sizeof (x)' ist 4, aber Sie wollen es 32, richtig? –

+0

Versuchen Sie, ein einzelnes Bit oder eine Gruppe von vier Bits zu drehen, die mit einer einzelnen Hexadezimalziffer bezeichnet werden? –

+0

Sie scheinen zwischen Bits und Hex-Ziffern gemischt. Jede hexadezimale Zahl repräsentiert 4 Bits –

Antwort

0

anstelle von sizeof(x) sollten Sie 8*sizeof(x) schreiben, es sieht generisch aus, weil Ihre Eingabe kurz int, long int oder irgendetwas sein kann.

Für Rechtsdrehung anstelle von rotierenden Schleifen können Sie unter Logik versuchen.

#include<stdio.h> 
unsigned int rotr(unsigned int x, int n) { 
     unsigned int z; 
     z = (x >> n) | (x << (8*sizeof(int) - n)) ; 
     return z; 
} 
int main() 
{ 
     unsigned int num= 0x12345678, n = 4, ret; 

     printf("before : %x\n",num); 
     ret= rotr(num,n); 
     printf("before : %x\n",ret); 
} 
+0

Was ist der Unterschied zwischen den beiden Codes? Ich habe versucht, den Code oben (Ersetzen von sizeof (x) mit sizeof (int) * 8-1) mit Ihrer Funktion hier, und während der Code oben und Ihr Code beide für rotierende 0x12345678 arbeiten, funktioniert meine nicht, wenn ich es wäre sagen wir 0x1234 (ich muss meinen Code für jeden hexadezimalen und dezimalen Wert berücksichtigen). Dein scheint auch für 0x1234 zu arbeiten, während meiner nicht. –

+0

z = x | (y << (8 * sizeof (x) -1)), es funktioniert nicht, denn ob "y" 0 oder 1 ist, du bewegst dich immer nur auf die 31. Position, aber das sollte nicht immer sein. – achal

+0

@ B.M.Corwen hast du? Nehmen Sie ein einfaches Beispiel und notieren Sie die Binärdatei für jede Iteration. Sie werden sicherlich – achal

3

sizeof(x) wird die Größe der Variablen in Bytes geben, während die Shift-Operatoren mit Zahlen von Bits arbeiten. Sie müssen diese Operanden konvertieren, um dieselbe Einheit zu verwenden.

+0

Es funktionierte mit 32-1, anstatt Größe von (x) -1 zu verwenden. Funktioniert die Verwendung von 32 jedoch in allen Fällen? Ich versuche nur Bits zu drehen, also hatte n gleich 3, das Ergebnis sollte 2468ACF oder 0000 0010 0100 0110 1000 1010 1100 1111 sein. –

+0

int hat keine garantierte Größe, aber Sie können die Bits mit etwas Mathe finden . https://stackoverflow.com/questions/3200954/what-is-char-bit –

Verwandte Themen