Недавно я увидел изящный способ поменять местами две переменные с помощью XOR и решил попробовать это в C# со строками, и хотя мне удалось это сделать, я немного обеспокоен тем, что мне придется преобразовать int в байт после операции XOR. Вот код:
var string1 = Encoding.ASCII.GetBytes("Hello world1!");
var string2 = Encoding.ASCII.GetBytes("Hello world2!");
for (var i = 0; i < string1.Length; i++)
{
string1[i] = (byte)(string1[i] ^ string2[i]);
}
for (var i = 0; i < string2.Length; i++)
{
string2[i] = (byte)(string1[i] ^ string2[i]);
}
for (var i = 0; i < string1.Length; i++)
{
string1[i] = (byte)(string2[i] ^ string1[i]);
}
Console.WriteLine(Encoding.ASCII.GetString(string1));
Console.WriteLine(Encoding.ASCII.GetString(string2));
Есть ли лучший способ сделать это? И раз уж мы заговорили об этом, что на самом деле происходит, когда вы приводите примитивы в C#? Выделяется ли для него какая-либо новая память?
С появлением кортежей в C# трюк с xor
уже не такой аккуратный, как раньше:
var string1 = Encoding.ASCII.GetBytes("Hello world1!");
var string2 = Encoding.ASCII.GetBytes("Hello world2!");
(string1, string2) = (string2, string1);
Console.WriteLine(Encoding.ASCII.GetString(string1));
Console.WriteLine(Encoding.ASCII.GetString(string2));
Синтаксис кортежа объясняется здесь.
Это классный способ решить эту проблему! И в этом случае вам даже не нужно преобразовывать строку в массив байтов... Спасибо, что поделились!
На самом деле это не то же самое: происходит замена массивов, а не их содержимого.
Хоть это и забавный трюк, он не имеет практического применения, поскольку гораздо эффективнее выполнить простую операцию, которую вы бы сделали, чтобы поменять местами две строки.