PDA

View Full Version : سوال: جا به جا کردن دو رشته با عملگر xor



a.bamin
دوشنبه 18 خرداد 1394, 23:14 عصر
با سلام و عرض ادب

من میخوام دو تا رشته رو با عملگر xor جا به جا کنم بدون این که متغییر جدیدی تعریف کنم،کسی میدونه کدش چیه؟
ممنون میشم اگر توضیح هم بدید.

Pharaz
پنج شنبه 28 خرداد 1394, 18:08 عصر
یه الگوریتم (https://en.wikipedia.org/wiki/XOR_swap_algorithm) کلی برای جابه جایی دو تا مغیر با استفاده از xor هست:


X := X XOR Y
Y := X XOR Y
X := X XOR Y

این الگوریتم وقتی تعداد بیت های دوتا متغیر برابر باشه پیاده سازیش راحته، ولی برا دوتا string که لزوما اندازه برابری ندارن به این سادگی نیست.
کاری که من کردم این بود که فرض کردم طول s1 بیشتر از s2 باشه. s2.Length کاراکتر اول دوتا متغیر رو با الگوریتم بالا جابه جا کردم. بعد ادامه ی s1 رو به s2 چسبوندم و از انتهای s1 حذف کردم. فکر می کنم اینکار اصلا پرکتیکال نباشه چون چند بایت بیشتر برای متغیر جدید چیزی از حافظه های امروزی کم نمی کنه.
پ.ن1: برای اینکه بتونم کاراکتر nـُم رشته رو تغییر بدم به جای string از StringBuilder استفاده کردم.
پ.ن2: چون گفتی از هیچ متغیر جدید استفاده نشه من خودمو محدود کردم که s2.Length رو تو یه متغیر عددی ذخیره نکنم. اگه استفاده می کردم اون if آخر تمیز تر و با معنی تر می شد.
StringBuilder s1 = new StringBuilder("LongString");
StringBuilder s2 = new StringBuilder("String");
for(int i = 0; i < s1.Length; i++)
{
if (i >= s2.Length)
continue;
s1[i] = (char)(s1[i] ^ s2[i]);
}
for (int i = 0; i < s2.Length; i++)
{
s2[i] = (char)(s1[i] ^ s2[i]);
}
for (int i = 0; i < s2.Length; i++)
{
s1[i] = (char)(s1[i] ^ s2[i]);
}
if(s1.Length > s2.Length)
{
s1.Insert(s2.Length, '\0');
s2.Append(s1.ToString().Substring(s2.Length + 1));
s1 = s1.Remove(s1.ToString().IndexOf('\0'), s1.Length - s1.ToString().IndexOf('\0'));
}
Console.WriteLine(s1.ToString());
Console.WriteLine(s2.ToString());