2013-07-25 10 views
7

Quale sarebbe la funzione inversa per questo?Invertire uno spostamento a sinistra bit a bit e l'assegnazione OR

A = (B << 3) | 0x07; 

Come posso ottenere un B quando ho già il corrispondente A?

+1

Quindi stai spostando a sinistra 3 e impostando i 3 bit bassi su 1? Cosa c'è di sbagliato con 'B = (A >> 3)'? (supponendo che ti accorgi di perdere pezzi quando ti sposti) – Nigel

risposta

15

Non è possibile recuperare completamente tutti i bit.

B << 3 sposta "B" tre bit a sinistra e non si avvolge. Ciò significa che lo stato dei primi tre bit di B vengono cancellati - a meno che non si sa chi, non sarebbe in grado di recuperare B.

Esempio:

10101101 << 3 

Turns: 10101101 
      ^---^ 
Into: 01101000 
     ^---^ 

I primi tre bit vanno persi, e i tre inferiori sono pieni di zeri. I dati cancellati sono cancellati.

Il | 0x07 riempie i tre bit di fondo (con 111), quindi, anche se non spostare, saresti cancellando i più bassi tre bit con 111, rendendo quei bit irrecuperabile.

Ora, se è stato XOR'd anziché in OR, sarebbe recuperabile con un altro XOR:

A^same-valuepuò essere annullata con un altro A^same-value perché ((A^B)^B) == A

A | same-valuenon può essere annullato con un altro A | same-value

A | same-value anche non può annullare ne con un AND: A & same-value

Ma lo spostamento causerebbe ancora problemi, anche se era XOR'd (che non è).

+2

Correggi, perdi i primi tre bit. Anche se la funzione iniziale è stata modificata per essere una rotazione sinistra, perderai comunque le informazioni perché '| 0x07' sta comunque impostando i tre bit più a destra. – Anthony

1

Given (Utilizzando 8-bit B come esempio, utilizzando 0b per forma binaria, manifestazione unica)

B = 0b00000000 
B = 0b00100000 
//... 
B = 0b11100000 

È possibile ottenere lo stesso A, quindi non credo che si può invertire il calcolo, la i 3 bit più a sinistra sono persi.