PROBLEMA [LINGUAGGIO C]Come faccio a "non perdere" i bit quando eseguo lo shift tramite operatori bitwise?

Pubblicità

Ciro Borriello

Nuovo Utente
Messaggi
3
Reazioni
0
Punteggio
23
Per esempio:
'V' in binario è 01100110
se eseguo lo shift a destra di 2 bit mi trovo
00011001
A questo punto dovrei sostituire i 2 bit 'persi' con gli '0' che sono stati aggiunti e verrebbe:
10011001 che sarebbe 'W'
devo eseguire il tutto utilizzando gli operatori bitwise
 
Se non dici in che modo li stai trattando risulta difficile.
Utilizzando solo gli operatori bitwise non puoi fare ciò che chiedi, o almeno, al momento non mi vengono idee...

Ad ogni modo continuo a non capire ciò che hai scritto sai. 'V' in binario è 01010110 (86d), e schiftando di due bit a destra ottieni 00010101 (21d).
La 'W' è 01010111, ovvero il numero di prima + 1 e non puoi ottenerlo shiftando bit (in quanto lo shift a destra di 1 bit corrisponde alla divisione per 2; lo shift di due bit, come nel tuo caso corrisponde quindi a dividere per 2 e poi ancora per 2).

Quindi alla luce di tutto ciò... ti chiedo se puoi rispiegarti meglio e se sei certo di ciò che vuoi fare. ;)
 
per ricordare i bit ti serve una maschera di bit
una maschera di bit consiste in una sequenza di bit che sono tutti 0 tranne i bit che vuoi ricordare,che devono essere 1;
per esempio se vuoi ricordare i bit più a destra, devi mettere tanti 1 alla fine quanti ne vuoi ricordare
v = 0110 0110
m = 0000 0011 questa è la maschera che ti aiuterà a ricordare gli ultimi 2 bit a destra

a questo punto devi fare un AND bit a bit di v con m
poiché la maschera è composta da tutti 0, il risultato "ricorderà" i bit 1 (solo i 2 più a destra) di v

z= v & m = 0000 0010 a questo punto stiamo ricordando gli ultimi 2 bit a destra di v

siccome tu vuoi reinserirli a sinistra devi shiftare z di 8-2=6 posizioni verso sinistra ottentendo
z = 1000 0000
in generale shifterai z di K posizioni a sinistra dove K è il numero di bit rightmost (i più a destra) da ricordare

ora
w = 0001 1001 è v shiftato a destra di 2
z = 1000 0000

con un OR bit a bit rimetti gli 1 al posto giusto, per cui il nuovo w sarà
w = (w | z) = 1001 1001
per l'altro senso di rotazione basta invertire il verso dello shift di z

non ho fatto altre prove ma mi sembra che funzioni in generale
a proposito: la maschera si definisce con un intero (unsigned);
la maschera di questo esempio è il numero 3 (in binario 0000 0011).
 
Ultima modifica:
Farei notare che ruotare != shiftare e che "salvare" quello che lo shr azzera è ben poco sensato.
Comunque:
Codice:
unsigned n = 102;
unsigned tmp = n & 3;
n >>=2;
n |= tmp << 6;
a te capire come generare la maschera con n bit ad 1.
 
Farei notare che ruotare != shiftare e che "salvare" quello che lo shr azzera è ben poco sensato.
concordo con te,
ho preferito spiegare come fare l'esercizio piuttosto che presentargli il codice;
tieni conto che, per chi inizia a programmare, il compatto codice C che hai scritto potrebbe essere
leggermente incomprensibile se non si comprende prima cosa c'è "dietro".
 
Pubblicità
Pubblicità
Indietro
Top