Lý do tại sao nó hoạt động là do XOR không mất thông tin. Bạn có thể làm điều tương tự với phép cộng và trừ thông thường nếu bạn có thể bỏ qua tràn. Ví dụ, nếu biến cặp A, B ban đầu chứa các giá trị 1,2, bạn có thể trao đổi chúng như thế này:
// A,B = 1,2
A = A+B // 3,2
B = A-B // 3,1
A = A-B // 2,1
BTW có một thủ thuật cũ để mã hóa một danh sách liên kết 2 chiều trong một "con trỏ đơn ". Giả sử bạn có một danh sách các khối bộ nhớ tại địa chỉ A, B, và C. Từ đầu tiên trong mỗi khối là, tương ứng:
// first word of each block is sum of addresses of prior and next block
0 + &B // first word of block A
&A + &C // first word of block B
&B + 0 // first word of block C
Nếu bạn có quyền truy cập để chặn A, nó cung cấp cho bạn địa chỉ của B Để đến được C, bạn lấy "con trỏ" trong B và trừ A, v.v. Nó hoạt động cũng như ngược lại. Để chạy dọc theo danh sách, bạn cần phải giữ con trỏ đến hai khối liên tiếp.Tất nhiên bạn sẽ sử dụng XOR thay vì cộng/trừ, vì vậy bạn sẽ không phải lo lắng về tràn.
Bạn có thể mở rộng điều này thành "web được liên kết" nếu bạn muốn có một số điều thú vị.
Nguồn
2009-02-09 15:25:31
Tôi nghĩ rằng biến xor biến hút trên các lõi thực thi ngoài trật tự. Mỗi xor tiếp theo có một sự phụ thuộc đọc sau khi viết, và cần phải đợi câu trả lời hoàn thành. cho x86, bạn nên tắt mã hóa như bình thường. Trình biên dịch nên phát ra một cái gì đó phong nha. – Calyth