2013-07-25 17 views
7

Jaka byłaby funkcja odwrotna?Odwróć bitową lewą zmianę i OR przypisanie

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

Jak mogę uzyskać B kiedy już mają odpowiednie A?

+1

Więc przesuwasz się w lewo 3 i ustawiasz niskie 3 bity na 1? Co jest nie tak z 'B = (A >> 3)'? (zakładając, że zdajesz sobie sprawę, że tracisz bity podczas zmiany) – Nigel

Odpowiedz

15

Nie można w pełni odzyskać wszystkich bitów.

B << 3 przesuwa "B" o trzy bity w lewo i nie obraca się wokół niego. Oznacza to, że stan trzech najlepszych bitów B są usuwane - jeżeli nie wiesz, te, nie byłby w stanie odzyskać B.

Przykład: giną

10101101 << 3 

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

Górne trzy bity, i dolne trzy są wypełnione zerami. Usunięte dane zostaną usunięte.

| 0x07 wypełnia dolne trzy bity (z 111), więc nawet jeśli nie przesuwają, byłbyś kasowania najniższych trzy bity z 111, co czyni te bity nie do odzyskania.

Teraz jeśli został XOR'd zamiast OR'd, byłoby odzyskać z innym XOR:

A^same-valuemoże być cofnięte z innym A^same-value ponieważ ((A^B)^B) == A

A | same-valuenie może być nie można cofnąć z innym ne z ORAZ: A & same-value

Jednak zmiana nadal powodowałaby problemy, nawet jeśli byłaby XOR-em (której nie jest).

+2

Prawidłowo, tracisz trzy najlepsze bity. Nawet jeśli pierwotna funkcja została zmieniona na lewą rotację, nadal będziesz tracić informacje, ponieważ '| 0x07' ustawia w każdym razie najbardziej prawe trzy bity. – Anthony

1

Zważywszy (za pomocą 8-bitowego B jako przykład za pomocą 0b do postaci binarnej, tylko demonstracja)

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

można uzyskać ten sam A, więc nie sądzę, że można odwrócić obliczeniowego 3 ostatnie bity są tracone.