Il problema: Esercizio 2-8 del linguaggio di programmazione C, "Scrivi una funzione rightrot (x, n) che restituisce il valore dell'intero x, ruotato verso destra di n posizioni."Bit rotazione in C
Ho fatto questo in ogni modo che so come. Ecco il problema che sto avendo. Prendi un dato numero per questo esercizio, diciamo 29, e ruotalo a destra di una posizione.
11101 e diventa 11110 o 30. Diciamo per il ragionamento che il sistema su cui stiamo lavorando ha un numero intero senza segno di 32 bit. Diciamo inoltre che abbiamo il numero 29 memorizzato in una variabile intera senza segno. In memoria il numero avrà 27 zeri prima di esso. Quindi, quando ruotiamo a destra uno dei due utilizzando uno dei numerosi algoritmi, il mio è pubblicato qui sotto, otteniamo il numero 2147483662. Questo ovviamente non è il risultato desiderato.
unsigned int rightrot(unsigned x, int n) {
return (x >> n) | (x << (sizeof(x) * CHAR_BIT) - n);
}
Tecnicamente, questo è corretto, ma stavo pensando che i 27 zeri che sono di fronte a 11101 erano insignificanti. Ho anche provato un paio di altre soluzioni:
int wordsize(void) { // compute the wordsize on a given machine...
unsigned x = ~0;
int b;
for(b = 0; x; b++)
x &= x-1;
return x;
}
unsigned int rightrot(unsigned x, int n) {
unsigned rbit;
while(n --) {
rbit = x >> 1;
x |= (rbit << wordsize() - 1);
}
return x;
Questo ultimo e definitivo soluzione è quella in cui ho pensato che ho avuto, vi spiegherò dove non è riuscito una volta che arrivare alla fine. Sono sicuro che si vedrà il mio errore ...
int bitcount(unsigned x) {
int b;
for(b = 0; x; b++)
x &= x-1;
return b;
}
unsigned int rightrot(unsigned x, int n) {
unsigned rbit;
int shift = bitcount(x);
while(n--) {
rbit = x & 1;
x >>= 1;
x |= (rbit << shift);
}
}
Questa soluzione dà la risposta previsto di 30 che stavo cercando, ma se si utilizza un numero per x come oh dico 31 (11111), poi ci sono problemi, in particolare il risultato è 47, usando uno per n. Non ci avevo pensato prima, ma se un numero come 8 (1000) viene usato allora mayhem. C'è solo un bit impostato in 8, quindi il cambiamento sarà sicuramente sbagliato. La mia teoria a questo punto è che le prime due soluzioni sono corrette (principalmente) e mi manca solo qualcosa ...
Prenderò questo per indicare che il comportamento dei primi due esempi era corretto e non sto impazzendo. – Brandon
Non sono sicuro della tua ipotesi che 2147483662 sia la risposta sbagliata. Sembra giusto per me! La domanda dice "l'intero x", che implica un certo numero di bit in x, ad es. 32. Altrimenti, dovrebbe rightrot (1,1) restituire sempre 1? –
Signor Lister, concordo interamente. Ci sono apparentemente alcune concezioni che ho avuto su Binay, il modo in cui è memorizzato e il modo in cui è interpretato che erano sbagliate. Supponevo che il valore fosse sbagliato in primo luogo, perché stavo prendendo i 27 zeri procedendo con il valore che stavo usando in memoria per non essere significativo per quel valore. e capisco quello che dici di uno. Se rightrot (1,1) restituisce sempre 1, come è possibile che ne sia rimasto uno ruotato di un numero come 1000 o 10000000000000000000000000000000. – Brandon