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
?
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
?
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-value
può essere annullata con un altro A^same-value
perché ((A^B)^B) == A
A | same-value
non 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 è).
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
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.
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