2013-07-25 44 views
7

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?

+1

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

Trả lời

15

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-valuethể được hoàn tác với một A^same-value((A^B)^B) == A

A | same-valuekhô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).

+2

Đú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

1

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.