نوشته شده توسط
User_Soual
سلام و خسته نباشید
من یک برنامه ای داشتم
این برنامه من باید جای مقادیر دو واحد ارایه رو بدون متغیر کمکی تغییر بده ایا کدی هست که بدون متغیر کمکی این کارو بکنه؟؟
یک مثال میزنم:
char [] a = new char [1];
char temp;
a[0] = "A";
a[1] = " B";
temp = a[0];
a[0] = a[1];
a[1] = temp;
نمیخوام از temp استفاده کنم
ممنون
فقط توجه داشته باشید که کد خودتون هم باگ داشت.
1- تعداد آرایه را کم تعرف کردید
2- برای char باید از تک کوتیشن استفاده کنید
char[] a = new char[2];
a[0] = 'A';
a[1] = 'B';
Console.WriteLine("befor swap a[0] is:"+a[0]);
Console.WriteLine("befor swap a[1] is:" + a[1]);
a[0] = (char)(a[0] ^ a[1]);
a[1] = (char)(a[0] ^ a[1]);
a[0] = (char)(a[0] ^ a[1]);
Console.WriteLine("after swap a[0] is:" + a[0]);
Console.WriteLine("after swap a[1] is:" + a[1]);
Console.ReadLine();
منطق خیلی ساده ای هم داره!
کافی که بیت های متغیرها را باهم xor کنید والبته چون عملگرهای بیتی فقط بر روی داده های نوع int عمل میکنند بنابراین کامپایلر یک cast ضمنی به نوع int انجام میده! وبه علت اینکه در سی شارپ نوع char , int باهم متفاوت هستند از یک cast صریح هم برای تبدیل به char استفاده شده است.
//A ascii ->65 binary -> 0100-0001
//B ascii ->66 binary -> 0100-0010
a[0] =a[0] ^ a[1] ; // -> 0100-0001^0100-0010 = 0000-0011 -> a[0] -> 3
a[1] =a[0] ^ a[1] ; // -> 0000-0011^0100-0010 = 0100-0010 -> a[1] -> 65
a[0] =a[0] ^ a[1] ; // -> 0000-0011^0100-0010 = 0000-0011 -> a[0] -> 66
و این هم نسخه بهینه تر در ++C
char* sw = new char[2];
*(sw+0) = 'A';
*(sw+1) = 'B';
*(sw+0) = *(sw+0) ^ *(sw+1);
*(sw+1) = *(sw+0) ^ *(sw+1);
*(sw+0) = *(sw+0) ^ *(sw+1);
cout << *sw << '\n' << *(sw+1) << '\n';