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
?
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
?
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-value
może być cofnięte z innym A^same-value
ponieważ ((A^B)^B) == A
A | same-value
nie 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).
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
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.
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