Ghi chú đầu bài:

Bài viết mình chỉ nói đến việc swap giá trị 2 biến kiểu integer trong C#. Với các kiểu dữ liệu khác thì mình không đảm bảo nó đúng, vì bài viết không nhằm mục đích đó Smile


Nhắc lại bài toán:

Cho 2 biến a và b. Hãy viết 1 hàm đổi giá trị của 2 biến cho nhau.

Ví dụ:

a = 3;

b = -2;


Phương pháp kinh điển nhất, cơ bản nhất là Dùng biến tạm:


void swap_temp(ref int a, ref int b)
{
    int t = b;
    b = a;
    a = t;
}




Quá dễ dàng phải không? Tuy nhiên với cách này ta sẽ tốn bộ nhớ khi phải khởi tạo thêm 1 biến nữa.


Phương pháp thứ 2, không dùng biến tạm (Cách này khi đi phỏng vấn có nơi hỏi đấy nhé, hehe):


void swap(ref int a, ref int b)
{
    a = a + b;
    b = a - b;
    a = a - b;
}



Ồ, khá hơn rồi. Cách này ta không tốn thêm bộ nhớ, nhưng tốn thêm 1 chút thời gian xử lí. Nhưng không đáng kể cho lắm.


Phương pháp thứ 3, không dùng biến tạm luôn, cũng chẳng phải cộng trừ:


void swap_xor(ref int a, ref int b)
{
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
}




Ồ, nhiều bạn đọc tới đây sẽ ngạc nhiên vì công dụng của toán xử XOR. Với toán tử XOR, ta có thể làm được nhiều điều hay ho hơn nữa. Tuy nhiên, ....


Mục đích bài viết này mình muốn nói đến rằng:

- Khi được học, ta được dạy là phương pháp thứ 1, nhưng khi đi phỏng vấn người ta lại hỏi ta phương pháp thứ 2 và trong khi ta tối ưu hóa chương trình hay tìm hiểu sâu thêm thì lòi ra phương pháp thứ 3.

- Đừng quá cứng nhắc với kiến thức mình đã học, nghĩa là đừng thấy thầy cô dạy sao thì ta làm y như vậy và nghĩ thầy cô là chuẩn nhất rồi.. Tự kiểm chứng những gì đã học và mở rộng ra nhé ;)

- Bài toán trên bắt nguồn từ 1 bài tập cơ bản nhất trong lập trình, tuy nhiên nếu đào sâu thêm tí nữa, ta sẽ thấy có nhiều điều phải nói, phải xem xét ;)


Ref: https://kipalog.com/posts/Su-dung-toan-tu-XOR - Cám ơn tác giả cũng như bạn Minh đã comment bên Kipalog, nhờ đó mà mình lại nhớ đến bài toán này :D