Giả sử tôi có một bàn tay của 8 thẻ:
7 8 9 10 J Q K A
Làm thế nào chúng ta có thể đảo ngược họ? Một cách là để trao đổi cặp liền kề:
8 7 10 9 Q J A K
nhóm Sau đó, trao đổi liền kề 2: trao đổi 8 7 và 10 9, vv:
10 9 8 7 A K Q J
Cuối cùng, các nhóm trao đổi bốn, mà là một nửa kích thước của 8:
A K Q J 10 9 8 7
Xong.
Bạn có thể thực hiện việc này theo các đơn đặt hàng khác nhau. Tại sao? Bởi vì các trao đổi là ổn định đối với nhau. Khi chúng ta trao đổi nửa trên của các thẻ với nửa dưới, ví dụ, các cặp vẫn giữ nguyên thứ tự. Hoặc khi chúng ta trao đổi các cặp, hai nửa vẫn giữ nguyên theo thứ tự.
Đây là những gì mã đang làm với các thao tác bit. Ví dụ để trao đổi cặp chúng ta có thể sử dụng mặt nạ 01010101 để chọn ra các bit chẵn, và 10101010 để chọn ra các bit lẻ, sử dụng phép toán AND hoạt động:
ABCDEFGH ABCDEFGH
& 01010101 & 10101010
---------- ----------
= 0B0D0F0H A0C0E0G0
Hãy nhớ rằng, các quy tắc cho và là đưa ra một số bit value X, X & 1 = X và X & 0 = 0. 1 bit trong mặt nạ bảo toàn giá trị, và 0 bit trong mặt nạ tạo ra 0. Điều này được gọi là mặt nạ bởi vì nó trông giống như một mặt nạ được sử dụng trong phun -painting, vv Các 1 bit "bao gồm" những nơi bạn không muốn "vẽ" với số không.
Tiếp theo, kết quả bên trái được dịch chuyển sang trái một chút và kết quả phải dịch chuyển sang phải.Điều này mang lại sự hoán đổi:
B0D0F0H0 0A0C0E0G
Cuối cùng, cả hai được kết hợp với logic HOẶC. Các quy tắc cho OR là X hoặc 0 là X. Hai phần từng có 0 nơi khác có khác không, và vì vậy các bit đơn giản là hợp nhất:
B0D0F0H0
| 0A0C0E0G
----------
= BADCFEHG
Và bây giờ các cặp được hoán đổi.
Swap, quý trao đổi, eights hoán đổi ... –
@pst xin giải thích thêm – Eight
Tại sao bạn không làm việc nó ra bằng bút chì và giấy? Sử dụng số 8 bit và chỉ lên tới 0x0F/0xF0. – Kaz