swap without temp

بسم الله
السلام عليكم
أمتحنت اليوم هياكل بيانات والحمدلله بمناسباتها كان أهم معاملين نعمل علي تقليلهما طوال دراستنا المساحة والزمن
المهم ندخل في الموضوع كيفية عمل تبديل لمتغيرين بدون أستخدام متغير ثالث مؤقت
هناك طريقتان
الاولي

public static void swap(int a,int b){
a+=b;
b=a-b;
a=a-b;
}
}

 

الآن ماذا فعلنا لنفرض ان a=5 &b=3
ضفنا قيمة b إلي a فأصبحت a=8
طرحنا قيمة bمن a ثم وضعناها في b إذا b=5
ثم نطرح قيمة b من a ونضعها في a إذا a=3
سهلة أليست كذلك
ننتقل للطريقة الثانية

public static void swap(int x,int y){
x ^= y;
y ^= x;
x ^= y;
}
}

أولاً ماهذا ^ أنه XOR operator
ماذا يفعل يخرج واحد إذا كان القيمتان مختلفان وصفر إذا كانا متشابهان كيف
عندنا قيمتان 5 و 3 نكتبهم بالنظام الثنائي وسيوضح الأمر
101
011
أول خانة منهما بها 1و1 إذاً الناتج 0
ثاني خانة 0و1 إذاً الناتج 1
الثالثة 1و0 إذاً الناتج 1
نكتبهم من اليمن 110
101
^
011
=
110
هل وضحت
الآن سنختبر الكود بفرض x=3وy=5
أولاً نضع في x قيمة x^y =6
ثم نضع في y قيمة y^x=5
ثم نضع في x قيمة x^y=3
ملحوظة المعامل ^ إبدالي
مرجع لفهم XOR أكثر هنا
ملحوظة أخري الطريقة الثانية من الممكن أن تسبب أخطاء في لغات oop لأنها تعمل علي الريجيستر كما رأيتم
وفي الختام أسألكم الدعاء لأخواننا في غزة بالنصر والفرج
دعواتكم نكمل باقي الأمتحانات علي خير
وسلام الله عليكم ورحمته وبركاته

Bookmark and Share

3 ردود على swap without temp

  1. Abou o'of قال:

    لن يحدث أخطاء في الطريقة الأوليجرب هذا الكود بالسي int main(){short x=300;short y=500;x+=y;y=x-y;x=x-y;printf(“%i %i\n”,x,y);return 0;}سيقوم بعمل سواب بدون مشاكل !!! وللعلم في xor القيمة تزيد ايضاً ولكنها زيادة صغيرة مقارنة بالطريقة الاوليبالنسبة لموضوع الريجيستري أنا ترجم ما فهمته ولكني لم أجرب ولم اقل أنه أكيد حدوث خطأ بل قلت أحتمالفي النهاية كيف يحمل متغير قيمة اكبر من قيمته حدثت معي كثيراً ولكني لا اعرف كيف تحدث بدون مشاكل لو عرفت أخبرني بالتوفيق

  2. علاء قال:

    ما الذي تعنيه بأنه حمل أكثر من قيمته؟؟لازلت أعتقد أن هناك مشكلة في استخدام الجمعتحياتي

  3. Abou o'of قال:

    أقصد أن مثلاً لدينا متغيران كلاهما short واستخدمنا معهم الطريقة الاولي وكانت قيمتهما 121,119 معني هذا أننا سنجمعهم معاً ونضعهما في أحدهما طبقاً للطريقة الاولي اي أننا سنضع في أحدهما 240 والمتغير short لا يحمل أكثر من 127 -حدث فيض -ومع هذا لايحدث خطأ وتتم العملية بدون مشاكل لا ادري كيف يحدث هذا ,هل تحدث عملية casting to int ممكن لكني لست متاكد .لو حضرتك تعرف ياريت تخبرناهل وضح ما أعنيه الآن؟بالتوفيق

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s

%d مدونون معجبون بهذه: