Hoán đổi giá trị 2 biến số chỉ dùng toán tử XOR

Có lẽ các bạn lập trình viên đã quá quen thuộc với đoạn code sau:

Đoạn code trên dùng để hoán đổi giá trị 2 biến số x và y. Giả sử x = 5, y = 7, thì sau khi chạy qua đoạn code trên, x = 7, y = 5. Tuy nhiên, còn có một đoạn code khá thú vị để hoán chuyển giá trị 2 biến số như sau:


Thoạt nhìn, đoạn code trên như ma thuật vậy. Gán 3 lần, với cùng 1 biểu thức, thế mà thần kỳ sao lại hoán đổi giá trị 2 biến số với nhau thậm chí không cần dùng đến biến phụ.

Chúng ta cùng thử bình tĩnh đi sâu vào tìm hiểu ma thuật gì đang ẩn giấu đằng sau đoạn code này nhé…
Đầu tiên, ta thử sửa đoạn code trên thành 3 giá trị riêng biệt, ta có:

Như vậy, x2 có thể viết lại thành:

x2 = x1 ^ y1 = x1 ^ (x1 ^ y) = (x1 ^ x1) ^ y = 0 ^ y = y      ==> wow!

Tương tự:
y1 = x1 ^ y = (x ^ y) ^ y = x ^ (y ^ y) = x ^ 0 = x ==> cooool!
🙂 Hy vọng với bài viết rất ngắn này, các bạn có thể tìm thấy gì đó thú vị cho mình trong khi code. Tuy nhiên, mình khuyên các bạn không nên viết kiểu này. Vì mặc dù nó rất tốt về performance, nó lại quá tối tăm về mặt ngữ nghĩa và sẽ bất lợi cho các bạn trong quá trình debug sau này.
No Comments

Post A Comment