Trong lập trình, việc hoán đổi giá trị giữa hai biến là một thao tác cơ bản và thường gặp. Mặc dù cách phổ biến nhất là sử dụng một biến tạm thời, có những phương pháp khác có thể thực hiện việc này mà không cần đến biến phụ trợ, đặc biệt hữu ích trong các tình huống cần tối ưu hóa hoặc chỉ đơn giản là để rèn luyện tư duy lập trình. Dưới đây là ba kỹ thuật phổ biến để hoán đổi giá trị hai biến trong C#.
1. Hoán Đổi Sử Dụng Biến Tạm Thời
Đây là phương pháp trực quan và dễ hiểu nhất, được hầu hết các lập trình viên sử dụng. Nó hoạt động bằng cách lưu trữ giá trị của một biến vào một biến thứ ba (biến tạm thời), sau đó thực hiện các phép gán tuần tự để chuyển đổi giá trị giữa hai biến gốc. Biến tạm thời đóng vai trò là nơi lưu trữ an toàn để tránh mất dữ liệu trong quá trình hoán đổi.
using System;
namespace ExampleSwapping
{
class Program
{
static void Main(string[] args)
{
int firstVal = 10;
int secondVal = 5;
Console.WriteLine($"Giá trị ban đầu: firstVal = {firstVal}, secondVal = {secondVal}");
int storage = firstVal; // Bước 1: Lưu giá trị của firstVal vào biến storage
firstVal = secondVal; // Bước 2: Gán giá trị của secondVal cho firstVal
secondVal = storage; // Bước 3: Gán giá trị trong storage (giá trị ban đầu của firstVal) cho secondVal
Console.WriteLine($"Giá trị sau hoán đổi: firstVal = {firstVal}, secondVal = {secondVal}");
Console.ReadKey();
}
}
}
2. Hoán Đổi Bằng Phép Toán Số Học (Không Dùng Biến Tạm)
Phương pháp này sử dụng các phép toán cộng và trừ để hoán đổi giá trị của hai biến kiểu số nguyên mà không cần biến tạm. Nguyên tắc là dùng một biến để lưu trữ tổng của cả hai giá trị, sau đó dùng tổng đó để suy ra giá trị ban đầu của biến còn lại.
using System;
namespace ArithmeticSwapDemo
{
class Program
{
static void Main(string[] args)
{
int x = 3;
int y = 7;
Console.WriteLine($"Giá trị ban đầu: x = {x}, y = {y}");
x = x + y; // Bước 1: x trở thành tổng của giá trị ban đầu của x và y (3 + 7 = 10)
y = x - y; // Bước 2: y trở thành giá trị ban đầu của x (10 - 7 = 3)
x = x - y; // Bước 3: x trở thành giá trị ban đầu của y (10 - 3 = 7)
Console.WriteLine($"Giá trị sau hoán đổi: x = {x}, y = {y}");
Console.ReadKey();
}
}
}
3. Hoán Đổi Bằng Phép Toán Bitwise XOR (Không Dùng Biến Tạm)
Đối với các kiểu dữ liệu số nguyên, chúng ta có thể tận dụng thuộc tính của phép toán bitwise XOR (toán tử `^`) để thực hiện hoán đổi. Phép toán XOR có tính chất đặc biệt là A ^ B ^ B = A và A ^ A = 0. Điều này cho phép chúng ta hoán đổi giá trị mà không cần biến tạm, tương tự như phương pháp số học nhưng hiệu quả hơn ở cấp độ bit.
using System;
namespace BitwiseSwapDemo
{
class Program
{
static void Main(string[] args)
{
int valA = 3; // Giá trị nhị phân: 0011
int valB = 7; // Giá trị nhị phân: 0111
Console.WriteLine($"Giá trị ban đầu: valA = {valA}, valB = {valB}");
valA = valA ^ valB; // Bước 1: valA = (ban đầu valA) ^ (ban đầu valB) = (0011 ^ 0111) = 0100 (tức là 4)
// valA hiện tại lưu trữ thông tin để khôi phục cả hai giá trị.
valB = valA ^ valB; // Bước 2: valB = (valA hiện tại) ^ (ban đầu valB) = (0100 ^ 0111) = 0011 (tức là 3 - giá trị ban đầu của valA)
// valB đã chứa giá trị của valA ban đầu.
valA = valA ^ valB; // Bước 3: valA = (valA hiện tại) ^ (valB hiện tại) = (0100 ^ 0011) = 0111 (tức là 7 - giá trị ban đầu của valB)
// valA đã chứa giá trị của valB ban đầu.
Console.WriteLine($"Giá trị sau hoán đổi: valA = {valA}, valB = {valB}");
Console.ReadKey();
}
}
}