Chức năng nghịch đảo cho điều này là gì?Đảo ngược một phép dịch trái bit và gán OR
A = (B << 3) | 0x07;
Làm cách nào để nhận được B
khi tôi đã có A
tương ứng?
Chức năng nghịch đảo cho điều này là gì?Đảo ngược một phép dịch trái bit và gán OR
A = (B << 3) | 0x07;
Làm cách nào để nhận được B
khi tôi đã có A
tương ứng?
Bạn không bao giờ có thể khôi phục tất cả các bit đầy đủ.
B << 3
thay đổi 'B' ba bit sang trái và không lặp lại. Điều này có nghĩa tình trạng của ba bit đầu B được xoá hoàn toàn - trừ khi bạn biết đó, bạn sẽ không thể phục hồi B.
Ví dụ:
10101101 << 3
Turns: 10101101
^---^
Into: 01101000
^---^
Ba bit đầu bị mất, và ba phần dưới cùng được lấp đầy bằng số không. Dữ liệu đã xóa sẽ bị xóa.
Các | 0x07
lấp đầy ba bit đáy (với 111
), do đó ngay cả khi bạn không thay đổi, bạn sẽ được xóa ba bit thấp nhất với 111
, làm cho những bit không thu hồi.
Bây giờ nếu nó được XOR thay vì OR'd, nó muốn được thu hồi với XOR khác:
A^same-value
thể được hoàn tác với một A^same-value
vì ((A^B)^B) == A
A | same-value
không thể được hoàn tác với một số khác A | same-value
A | same-value
cũng không thể được hoàn tác ne có dấu AND: A & same-value
Nhưng sự dịch chuyển vẫn gây ra vấn đề, ngay cả khi nó là XOR'd (không phải vậy).
Đúng, bạn mất ba bit hàng đầu. Ngay cả khi chức năng ban đầu được thay đổi thành xoay vòng trái, bạn vẫn sẽ mất thông tin vì '| 0x07' là thiết lập ba bit bên phải nhất. – Anthony
Given (Sử dụng B
8-bit làm ví dụ, sử dụng 0b
cho dạng nhị phân, chỉ trình diễn)
B = 0b00000000
B = 0b00100000
//...
B = 0b11100000
Bạn có thể nhận được cùng một A
, vì vậy tôi không nghĩ rằng bạn có thể đảo ngược các tính toán, ngoài cùng 3 bit bị mất.
Vì vậy, bạn đang dịch chuyển sang trái 3 và đặt 3 bit thấp xuống 1? Có gì sai với 'B = (A >> 3)'? (giả sử bạn nhận ra rằng bạn bị mất bit khi bạn thay đổi) – Nigel