Обмін значеннями змінних типу Integer

pic

Обмін значеннями змінних типу Integer

Останнім часом я був дуже зайнятий проєктами і не мав часу писати. Однак я хотів поділитися чимось, тому записав кілька простих відомостей.

Чи використовуєте ви тимчасові значення для обміну змінними? Це теж гарна ідея. Однак можна також обмінювати змінні без використання тимчасових значень.

Приклад коду

Перш ніж пояснити, давайте спершу подивимося на код C#.

int a = 100;  
int b = 1;  

Console.WriteLine(a + ", " + b); // 100, 1

Значення 100 та 1 призначені змінним a та b. Тепер давайте обміняємо значення змінних a та b.

int a = 100;  
int b = 1;  

a ^= b;  
b ^= a;  
a ^= b;  

Console.WriteLine(a + ", " + b); // 1, 100

Значення змінено без використання тимчасової змінної! Я змінив значення a та b, використовуючи виключне АБО (XOR: ^).

Пояснення прикладу

XOR
Ця операція порівнює кожен біт і повертає 1, якщо біти різні, і 0, якщо вони однакові.

Змінюємо значення покроково, щоб показати процес операції.

int a = 100; // 01100100  
int b = 1; // 00000001  

a ^= b;  
/*  
 Крок 1  
 01100100  
 00000001  
 --------  
 01100101 => 101  
*/  
Console.WriteLine(a + ", " + b); // 101, 1  

b ^= a;  
/*  
 Крок 2  
 00000001  
 01100101  
 --------  
 01100100 => 100  
*/  
Console.WriteLine(a + ", " + b); // 101, 100  

a ^= b;  
/*  
 Крок 3  
 01100101  
 01100100  
 --------  
 00000001 => 1  
*/  

Console.WriteLine(a + ", " + b); // 1, 100

Висновок

Я спробував обміняти змінні без використання тимчасових змінних за допомогою XOR. Я написав цю статтю, щоб показати, що обмін може бути виконаний таким чином, але особисто не рекомендую використовувати цей метод у реальних проєктах. Ефективність пам'яті може бути трохи кращою, ніж при використанні тимчасових змінних, але читаність погіршується, виникають проблеми, коли змінні однакові, і цей метод можна застосувати лише до змінних типу integer. Якщо ви вирішуєте алгоритмічні задачі, це буде цікаво використовувати.

Перекладено з: Swap Integer Variable Values

Leave a Reply

Your email address will not be published. Required fields are marked *