_______________________________________
| الرئيسية | من انا | اتصل بي | روابط مفيدة | مشاريعي
_______________________________________

الأحد، 11 يناير 2009

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 لأنها تعمل علي الريجيستر كما رأيتم
وفي الختام أسألكم الدعاء لأخواننا في غزة بالنصر والفرج
دعواتكم نكمل باقي الأمتحانات علي خير
وسلام الله عليكم ورحمته وبركاته

هناك 4 تعليقات:

  1. مممممممممممممم
    أظن أنك عكست في موضوع مشكلة الريجستري
    لأن الخطأ سيحصل في الطريقة الأولى
    وهذا على أساس الفرض أن المتحولات تستطيع حمل قيمة قصوى
    مثلاً short يستطيع حمل حتى 127 ما الذي سيصحل لو كان العددين 126 و 5
    سنجد أنا حصلنا على عدد غير صحيح
    بيناما عند استخدام xor نلاحظ أن القيمة لا تزيد بحال من الأحوال وهذا شيء جيد جداً

    أتمنى التوضيح لو كان كلامي خائاَ

    تحياتي

    ردحذف
  2. لن يحدث أخطاء في الطريقة الأولي
    جرب هذا الكود بالسي
    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 القيمة تزيد ايضاً ولكنها زيادة صغيرة مقارنة بالطريقة الاولي
    بالنسبة لموضوع الريجيستري أنا ترجم ما فهمته ولكني لم أجرب ولم اقل أنه أكيد حدوث خطأ بل قلت أحتمال
    في النهاية كيف يحمل متغير قيمة اكبر من قيمته حدثت معي كثيراً ولكني لا اعرف كيف تحدث بدون مشاكل لو عرفت أخبرني
    بالتوفيق

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

    تحياتي

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

    ردحذف