اذهب إلى المحتوى

لوحة المتصدرين

  1. Wael Aljamal

    Wael Aljamal

    الأعضاء


    • نقاط

      5

    • المساهمات

      6975


  2. منتصر احمد

    منتصر احمد

    الأعضاء


    • نقاط

      4

    • المساهمات

      760


  3. محمد أبو عواد

    محمد أبو عواد

    الأعضاء


    • نقاط

      3

    • المساهمات

      6234


  4. Emad Saif

    Emad Saif

    الأعضاء


    • نقاط

      3

    • المساهمات

      205


المحتوى الأكثر حصولًا على سمعة جيدة

المحتوى الأعلى تقييمًا في 03/22/22 في كل الموقع

  1. حاولت تثبيت PHP و Apache و MySQL على سيرفر يعمل بنظام Debian ولكن المشكلة أني كلما قمت بتشغيل الموقع أجد الخطأ التالي: PDOException: could not find driver يصدر الخطأ من السطر التالي الخاص بعملية الإتصال بقواعد البيانات: $conn = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER, DB_PASS); وبالتأكيد يتم إستبدال الثوابت مثل DB_HOST و DB_NAME بالقيم الخاصة بها. مع العلم أن الكود يعمل على الجهاز الخاص بي، ولكن المشكلة تحدث على الخادم فقط! كيف أحل هذه المشكلة؟
    2 نقاط
  2. ماذا كلما اضيف صوره و اقوم بعمل ال border-redues: 50% لكي تصبح على شكل دائره يكون شكلها بيضاوي وشكرا
    2 نقاط
  3. كيف يمكنني ادراج صوره على برنامج Visual studio
    1 نقطة
  4. في المواقع الاخرى عند النقر على منتج معين يتم الذهاب الى صفحة ذات URL عشوائي مميز وهذا العنوان يقوم بعرض بيانات المنتج ، هل استطيع تحقيق ذلك ؟
    1 نقطة
  5. أحاول عمل نموذج لتسجيل المستخدمين الجدد registration form، وهذا النموذج يحتوي على حقل checkbox للموافقة على شروط الموقع Terms of Service، وحاولت أن أقوم بالتحقق من قيمة هذه الحقول وقمت بإستخدام الخاصية required public function store(Request $request) { $validated = $request->validate([ 'email' => 'required|unique:users', 'terms' => 'required', // ... ]); } ولكن المشكلة هي أن لارافيل Laravel يعرض رسالة خطأ حتى ولو قمت بتحديد الحقل checkbox، هنا كود HTML الخاص بحقل الإدخال: <input type="checkbox" name="terms"><label for="terms">I agree to our terms of service, privacy policy and cookie policy</label> ما هي المشكلة هنا؟ وكيف أقوم بالتحقق من قيمة الحقل checkbox في لارافيل Laravel بطريقة صحيحة؟
    1 نقطة
  6. how to Write a function that takes many numbers and returns an array of squares for every number example of input: (1,2,4,6) output: [1,4,16,36]
    1 نقطة
  7. حاول كتابة البرنامج بنفسك و يمكنك مشاركة الشيفرة التي تكتبها بشكل نصي وليس صورة لنصلح الأخطاء
    1 نقطة
  8. أحاول أن أقوم بعمل عنصر select ويسمح للمستخدم بإختيار أكثر من إختيار بالشكل التالي: <select multiple="multiple" name="options"> {% for option in options %} <option value="{{option.id}}">{{option}}</option> {% endfor %} </select> لكن المشكلة هي عندما أستعمل Django debug لمعرفة شكل الإختيارات أجد أول أختيار فقط، كيف أحصل على كل الإختيارات التي إختارها المستخدم وليس أول إختيار فقط؟
    1 نقطة
  9. حاولت افهم الفرق بين بث الرساله وبين بث الرساله وانتظر ولماذا عندما افعل بث الرساله وانتظر الاوامر لا تعمل بالترتيب
    1 نقطة
  10. مرحبا حاتم، يمكنك نشر تعيق أسفل الدرس لتتم المتابعة ضمن الدرس، وليعرف المدرب ما المعلومات التي تم شرحها ليقوم بتوضيحها. وأرجو إرفاق رابط مشروعك مع السؤال في تعليق أسفل الدرس و السماح بمشاركته (سماح بفتح المشروع من الآخرين) ليستطيع المدرب تتبع البرنامج و إصلاح الأخطاء نشر رسالة broadcast message تقوم بنقل التحكم إلى اللبنة البرمجية الهدف فقط. (نقل تسلسل تنفيذ البرنامج) أما broadcast and wait يقوم بنقل التحكم مؤقتاً للبنة برمجية أخرى وبعد انتهاء تنفيذها يعود لمتابعة اللبنة التي أطلقت الرسالة بعد إنتهاء التنفيذ لبنة الهدف
    1 نقطة
  11. يبدو أنك لم تقم بعمل build للمشروع الخاص بك، حاول تنفيذ الأمر التالي، وأعد المحاولة: webpack ويجب أن يكون لديك مجلد باسم dist يحتوي على ملفات المشروع بعد البناء، وهذه الملفات هي التي تحتاج إلى رفعها وليس ملفات المشروع نفسه. ملاحظة: أرجو منك أن تنشر الأسئلة المتعلقة بالدورات في التعليقات أسفل الدرس. تحياتي.
    1 نقطة
  12. يشرح هذا الفيديو كيفية استخدام GitHub Pages لاستضافة الصفحات. وسنشرح فيه صفحات المشاريع، وصفحات المستخدم أو المنظمة. لتتعرف أكثر على نظام Git وكيفية استخدامه، ننصحك بمشاهدة فيديو أساسيات Git في أكاديمية حسوب. قسم Git في أكاديمية حسوب غني بالمقالات المفيدة حوله.
    1 نقطة
  13. هل يمكنك توضيح المشكلة بمزيد من التفاصيل؟ هل تظهر لديك أي أخطاء في سطر الأوامر؟
    1 نقطة
  14. انا عملت زي اللي في الفيديو بس ما ظبط
    1 نقطة
  15. انا مش عارف اكتب ايه في الوصف بتاعي علي مستقل ولا وصف اي مشروع
    1 نقطة
  16. قمت بمراجعة الكود اكثر من مرة ولكن لا يعمل لا يظهر modal box رغم عدم ظهور اى اخطاء فى console Code html <div class="container"> <div class="row"> <div class="row"> <div class="col-lg-3 col-md-4 col-xs-6 thumb"> <a class="thumbnail" href="#" data-image-id="image-gallery-image" data-toggle="modal" data-title="egypt-1" data-image="./images/EGYPT-G1.jpg" data-target="#image-gallery"> <img class="img-thumbnail" src="./images/EGYPT-G1.jpg" alt="Another alt text"> </a> </div> <div class="col-lg-3 col-md-4 col-xs-6 thumb"> <a class="thumbnail" href="#" data-image-id="" data-toggle="modal" data-title="egypt-2" data-image="./images/EGYPT-G2.jpg" data-target="#image-gallery"> <img class="img-thumbnail" src="./images/EGYPT-G2.jpg" alt="Another alt text"> </a> </div> <div class="col-lg-3 col-md-4 col-xs-6 thumb"> <a class="thumbnail" href="#" data-image-id="" data-toggle="modal" data-title="egypt-3" data-image="./images/EGYPT-G3.jpg" data-target="#image-gallery"> <img class="img-thumbnail" src="./images/EGYPT-G3.jpg" alt="Another alt text"> </a> </div> <div class="col-lg-3 col-md-4 col-xs-6 thumb"> <a class="thumbnail" href="#" data-image-id="" data-toggle="modal" data-title="egypt-4" data-image="./images/EGYPT-G4.jpg" data-target="#image-gallery"> <img class="img-thumbnail" src="./images/EGYPT-G4.jpg" alt="Another alt text"> </a> </div> <div class="col-lg-3 col-md-4 col-xs-6 thumb"> <a class="thumbnail" href="#" data-image-id="" data-toggle="modal" data-title="egypt-5" data-image="./images/EGYPT-G5.jpg" data-target="#image-gallery"> <img class="img-thumbnail" src="./images/EGYPT-G5.jpg" alt="Another alt text"> </a> </div> <div class="col-lg-3 col-md-4 col-xs-6 thumb"> <a class="thumbnail" href="#" data-image-id="" data-toggle="modal" data-title="egypt-6" data-image="./images/EGYPT-G6.jpg" data-target="#image-gallery"> <img class="img-thumbnail" src="./images/EGYPT-G6.jpg" alt="Another alt text"> </a> </div> <div class="col-lg-3 col-md-4 col-xs-6 thumb"> <a class="thumbnail" href="#" data-image-id="" data-toggle="modal" data-title="egypt-7" data-image="./images/EGYPT-G7.jpg" data-target="#image-gallery"> <img class="img-thumbnail" src="./images/EGYPT-G7.jpg" alt="Another alt text"> </a> </div> <div class="col-lg-3 col-md-4 col-xs-6 thumb"> <a class="thumbnail" href="#" data-image-id="" data-toggle="modal" data-title="egypt-8" data-image="./images/EGYPT-G8.jpg" data-target="#image-gallery"> <img class="img-thumbnail" src="./images/EGYPT-G8.jpg" alt="Another alt text"> </a> </div> </div> <div class="modal fade" id="image-gallery" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> <div class="modal-dialog modal-lg"> <div class="modal-content"> <div class="modal-header"> <h4 class="modal-title" id="image-gallery-title"></h4> <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span> </button> </div> <div class="modal-body"> <img id="image-gallery-image" class="img-responsive col-md-12"> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary float-left" id="show-previous-image"><i class="fa fa-arrow-left"></i> </button> <button type="button" id="show-next-image" class="btn btn-secondary float-right"><i class="fa fa-arrow-right"></i> </button> </div> </div> </div> </div> Code JS $(function() { // Gallery Tours let modalId = $('#image-gallery'); loadGallery(true, 'a.thumbnail'); //This function disables buttons when needed function disableButtons(counter_max, counter_current) { $('#show-previous-image, #show-next-image').show(); if (counter_max === counter_current) { $('#show-next-image').hide(); } else if (counter_current === 1) { $('#show-previous-image').hide(); } } /** * * @param setIDs Sets IDs when DOM is loaded. If using a PHP counter, set to false. * @param setClickAttr Sets the attribute for the click handler. */ function loadGallery(setIDs, setClickAttr) { let current_image, selector, counter = 0; $('#show-next-image, #show-previous-image').on('click',function () { if ($(this).attr('id') === 'show-previous-image') { current_image--; } else { current_image++; } selector = $('[data-image-id="' + current_image + '"]'); updateGallery(selector); }); function updateGallery(selector) { let $sel = selector; current_image = $sel.data('image-id'); $('#image-gallery-title').text($sel.data('title')); $('#image-gallery-image').attr('src', $sel.data('image')); disableButtons(counter, $sel.data('image-id')); } if (setIDs == true) { $('[data-image-id]').each(function () { counter++; $(this).attr('data-image-id', counter); }); } $(setClickAttr) .on('click', function () { updateGallery($(this)); }); } }); Code SCSS #image-gallery { .modal-footer{ display: block; } } .thumb{ margin-top: 15px; margin-bottom: 15px; }
    1 نقطة
  17. حسنا في الاصدار الخامس من بوتستراب يجب أن تغير الخصائص data-toggle و data-target و data-dismiss الى التالي data-bs-dismiss data-bs-toggle data-bs-target ثم جرب الامر وأخبرنا بالنتيجة
    1 نقطة
  18. هل يمكنك ارفاق الكود الخاص بملف package.json لكي نتأكد من اصدار حزمة بوتستراب لديك؟
    1 نقطة
  19. هناك عميل يقول انه يريد موقع عن "اكسسوارات الكمبيوتر والموبايل والشبكات والكاميرات المراقبة" ف بكم ويريد لغتين فيه بعد اذنكم بسرعه
    1 نقطة
  20. انا اعمل على webpack ولا يوجد اى اخطاء تظهر حتى jquery يعمل ويظهر ids فى مكانه ومع ذلك لا يظهر modal
    1 نقطة
  21. تأكد أن الخاصية data-target في الزر الخاص بالمودل له نفس قيمة الخاصية id للمودل , لاحظ <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal"> ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Launch demo modal </button> <div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"> ^^^^^^^^^^^^^^^^ تأكد أنك نسخت الكود الخاص بالمكون مودل التابع للاصدار الذي تعمل عليه ,لو كنت تعمل على الاصدار الرابع من بوتستراب فتأكد أنك تستخدم المكون الخاص بالاصدار الرابع , وبالمثل للاصدار الخامس , تأكد انك تضمن ملف jquery و Popper.js اذا كنت تستخدم الاصدار الرابع من بوتستراب <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.min.js" integrity="sha384-w1Q4orYjBQndcko6MimVbzY0tgp4pWB4lZ7lr30WKz0vr/aWKhXdBNmNb5D92v7s" crossorigin="anonymous"></script>
    1 نقطة
  22. تخزين الوقت سيكون شبيه بتخزين Created_at ، updated_at بإمكانك أنشاء last_login_at في ملف migration، كما هو موضح هنا $table->timestamp('last_login_at'); بعدها ستذهب الى ملف يسمى auth/login.blade.php ، ستضع هذا ال input بداخل ال Form <input type="hidden" name="last_login_at" value="{{ Carbon::now() }}"> هنا يخزن قيمة الوقت الحالي اثناْ كل عملية تسجيل دخول ، بعدها ستذهب الى ملف app/Request/auth/LoginRequest ستجد authenticate Function ، وتمرر القيمة من خلال attempt بهذا الشكل if (! Auth::attempt($this->only('email', 'password', 'last_login_at'), $this->boolean('remember'))) { RateLimiter::hit($this->throttleKey()); } هكذا يتم تخزين وقت تسجيل الدخول للمستخدم .
    1 نقطة
  23. تبدأ هذه الفكرة من backend حيث يتم تمرير خاصية html مثل data-product-id=1234asfgv ضمن هيكلية هذا العنصر. ونقوم بإسناد معرف id العنصر لها، و في حال النقر على العنصر نقرأ product-id ومن ثم نقوم بعمل توجيه لصفحة خاصة بعرض المنتجات مع تمرير معرف العنصر ويمكن ذلك من خلال GET params مثلا، حيث أنه في المتحكم الخاص بعرض المنتجات نستعلم حسب id الممرر بعمل استعلام لقاعدة البيانات ثم نحقن البيانات في صفحة عرض النموذج. كما يمكن ذلك من خلال AJAX نقرأ url الصفحة الخاصة بالمنتجات (عندما نكون داخلها) و نستخلص product-id ثم نجلب بياناته و نحدث الصفحة
    1 نقطة
  24. الخاصية border-radius:50% تجعل الصورة دائرة في حالة فقط كانت الصورة لها نفس العرض ونفس الإرتفاع , عدا ذلك تجعلها شبه دائرية, لتصبح دائرية يجب أن يكون للصورة نفس العرض والإرتفاع, على سبيل المثال يكون عرضها 200بيكسل وإرتفاعها 200 بيكسل, أو أي رقمين متساويين
    1 نقطة
  25. عملية المقارنة ( | ) هي عملية ثناية تتم على مستوى البت وتعرف بـ Bitwise Operation: بحيث يتم فيها المقارنة على مستوى البتات المكونة لكل من الطرفين بدلاً من القيم ككل: print_r(1 | 2) // 3 ناتج الطباعة أما عملية المقارنة ( || ) فهي عملية منطقية تتم على مستوى نمط البيانات من نوع Boolean والتي تستخدم غالباً ضمن الجمل الشرطية وفي معظم الشيفرات البرمجية: print_r(1 || 2) // 1 ناتج الطباعة والفرق الأهم بين كل منهما هو أنه في عملية المقارنة المنطقية Boolean أو ( || ) يتم فيها التحقق من الشروط بدءً من اليسار، وفي حال تحقق شرط ما، يتم إهمال بقية الشروط. عكس الطريقة السابقة ( | ) حيث يتم فيها تنفيذ المقارنة الثنائية على جميع القيم (الشروط) الموجودة. if(condition1 || condition2 || condition3) //في حال تحقق الشرط الأول، سيتم التوقف عن تقييم بقية الشروط if(condition1 | condition2 | condition3) //سيتم تقييم جميع الشروط بغض النظر عن تحقق أي شرط منهم وهذا الفرق ينطبق أيضاً على عمليات & و && بشكل مشابه، ولكن بشكل عام نادراً مانجد استخدام لعمليات المقارنة الأحادية (أي | و &) وسبب ذلك بسيط: if(person != null && person.age < 18) في هذا المثال سيتم أولاً التحقق من الشرط الأول (وهو أن القيمة person لاتساوي null)، وفي حال تحقق الشرط لن يتم إكمال التحقق من الشروط الأخرى وسيتم الخروج من الجملة الشرطية فوراً. أما لو استخدمنا & بدلاً من && من الممكن أن نحصل على خطأ من نوع NullReferenceException وذلك لأننا نتحقق من خاصية age لمتغيّر غير موجود null. لذلك يتم في أغلب الأحيان استعمال عمليات المقارنة المزدوجة && و || ما لم يكن هناك حاجة ضرورية في البرنامج لاستخدام العمليات الأحادية أو عند الحاجة للتعامل على مستوى البت كما رأينا في Bitwise Operation أو ضمن لغات البرمجة منخفضة المستوى والقريبة من لغة الآلة.
    1 نقطة
  26. يمكنك القيام بذلك عبر الخطوات التالية : في البداية ننفذ التعليمة لنقوم بعملية التهجير php artisan make:migration add_login_fields_to_users_table ثم نذهب إلى المسار database/migrations ثم نفتح الملف add_login_fields_to_users_table ويكون الملف اسمه مع ارقام هي تاريخ انشاء هذا الملف class AddLoginFieldsToUsersTable extends Migration { public function up() { Schema::table('users', function (Blueprint $table) { $table->datetime('last_login_at')->nullable(); }); } } ثم الصق الكود السابق بدلاً عن الكود المكتوب في الملف الخطوة الثانية: اذهب إلى المسار app/User.php User.php هو ملف ال model الذي يحوي معلومات المستخدم وقد يكون اسم الملف مختلف لديك ع حسب الاسم الذي وضعته عندما انشئت جدول المستخدمين داخل الملف يوجد المصفوفة protected $fillable قم بإضافة العنصر التالي إليها protected $fillable = [ 'email', 'password', 'last_login_at', ///// هذا العنصر قم بإضافته ]; ثم إذهب إلى المسار التالي app/Http/Controllers/Auth/LoginController.php سوف تجد هذه الدالة التي تتنفذ عندما يقوم المستخدم بتسجيل دخوله protected function authenticated(Request $request, $user) { // } قم بحذفها وضع هذا الكود بدلاً عنها function authenticated(Request $request, $user) { $user->update([ 'last_login_at' => Carbon::now()->toDateTimeString() ]); } بهذه الطريقة سوف يضاف إلى جدول المستخدمين عمود لأخر تاريخ قام به المستخدم بتسجيل الدخول
    1 نقطة
  27. هل تستخدم نسخة ubuntu desktop؟ أرجو تحديد من أين قمت بتحميل النسخة. وما هي مع العلم أن سطر الأوامر يبدو جاهز لتنفيذ فما المشكلة؟
    1 نقطة
  28. مرحبًا محمود، بعد إنهائك للدورة وإجرائك للامتحان مرتين لم تستجب إلى إرشادات المدربين الذين نصحوك كيف تنجز المشاريع وكيف تتعلم بطريقة صحيحة... نلتزم في أكاديمية حسوب بما نعد طلابنا به، لذا أعدنا لك المبلغ الذي دفعته، ونرجو لك كل التوفيق في رحلتك القادمة.
    1 نقطة
  29. تستطيع تخزينها ك json وعرضها ك array داخل ملف migration: $table->json('your_array'); داخل ال model تقوم بعمل casting protected $casts = [ 'your_array' => 'array' ]; عند إدخال البيانات: $test_data = [ 'key_1' => 'value_1', 'key_2' => 'value_2, ]; Your_Model::create(['your_array' => $test_data]); وعند استخراج البيانات ستكون على شكل array
    1 نقطة
  30. إذا أردت تخزين المصفوفة ضمن حقل واحد في جدول ضمن قاعدة البيانات يمكنك الاستفادة من خاصية التحويل التلقائي في لارافل Casting، ضمن النموذج الخاص بالجدول نقوم بتعريف نوع التحويل للخاصية بفرض أن الخاصية تسمى data نحدد نوع التحويل كالتالي: class MyModel extends Model { protected $casts = [ 'data' => 'array', // لتحويل الحقل لمصفوفة ]; } بعدها يمكنك التعامل مع الخاصية بشكل طبيعي ضمن المشروع فتعين قيمة مصفوفة لتلك الخاصية ويمكنك استخراجها منها كالتالي: $model = User::first(); // الخيار $data من نوع مصفوفة $data = $model->data; // يتم تحويل القيمة المسندة تلقائيًا $model->data = ['option_1' => '...'];
    1 نقطة
  31. اذا كان هدفك تطبيقات الهواتف كما أشار الاستاذ وائل عليك بدورة ال js و انا مشترك بها لذا انصحك بها بشده
    1 نقطة
  32. كلامك صحيح، لغة بايثون تعمل في الواجهات الخلفية Back End اي في السيرفر أو مخدم التطبيقات و المواقع وهي توفر البيانات التي يعرضها التطبيق أو الموقع، أما تطبيقات الهاتف المحمول لها تقنيات مختلفة ولغة بايثون لا تعمل على الهاتف. دوراة أكاديمية حسوب التي تتيح لك فرصة بناء تطبيق يمكن رفعه على المتجر هي: دورة جافاسكربت لاحتوائها على مسار تعليم ريأكت نيتف React Native. وبعض مفاهيم كوردوفا
    1 نقطة
  33. تُنفَّذ العمليات البتية (أو الثنائية) على مستوى البت من البيانات وذلك باستعمال العوامل التالية: | - عامِل OR البِتِّي (Bitwise OR) إليك المثال التالي: int a = 5; // 0101b (0x05) int b = 12; // 1100b (0x0C) int c = a | b; // 1101b (0x0D) std::cout << "a = " << a << ", b = " << b << ", c = " << c << std::endl; يكون ناتج الشيفرة السابقة هو: a = 5, b = 12, c = 13 وسبب ذلك أن عامِل OR يعمل على مستوى البِتّْ (bit level)، ويستخدم جدول الصحة البوليني أو المنطقي (Boolean Truth Table) التالي: true OR true = true true OR false = true false OR false = false عندما يُطبق عامل OR على القيمتين البتّيّتين ‎a ‎ (أي 0101)‎ و ‎b ‎ (أي 1100)‎ ، سنحصل على القيمة البتّيّة 1101: int a = 0 1 0 1 int b = 1 1 0 0 | --------- int c = 1 1 0 1 لا يغير عامِل OR القيم الأصلية للمعامَلات إلا في حالة استخدام عامِل الإسناد البِتِّي المركَّب =| (Bitwise Assignment Compound Operator) لإسناد تغيير تلك القيم: int a = 5; // 0101b (0x05) a |= 12; // a = 0101b | 1101b ^ - عامل XOR البِتِّي (Bitwise XOR) إليك المثال التالي: int a = 5; // 0101b (0x05) int b = 9; // 1001b (0x09) int c = a ^ b; // 1100b (0x0C) std::cout << "a = " << a << ", b = " << b << ", c = " << c << std::endl; يكون ناتج الشيفرة السابقة: a = 5, b = 9, c = 12 وسبب ذلك أن عامِل XOR يعمل على مستوى البِتّْ (bit level)، ويستخدم جدول الصحة البولياني التالي: true OR true = false true OR false = true false OR false = false لاحظ أنه في عملية XOR، يكون لدينا true XOR true = false، على خلاف العمليتين AND و OR، إذ تحققان: true AND/OR true = true، وذلك هو وصف الطبيعة الحصرية لعملية XOR. عندما يُطبّق عامِل XOR على القيمتين البتّيّتين ‎a ‎ (أي 0101)‎ و ‎b ‎ (أي 1001)‎ ، سنحصل على القيمة البتّيّة 1101: int a = 0 1 0 1 int b = 1 0 0 1 ^ --------- int c = 1 1 0 0 لا يغير عامِل XOR القيم الأصلية للمعامَلات إلا في حالة استخدام عامِل الإسناد البِتِّي المركَّب =^ (Bitwise Assignment Compound Operator) لإسناد تغيير تلك القيم: int a = 5; // 0101b (0x05) a ^= 9; // a = 0101b ^ 1001b يمكن استخدام عامِل XOR بعدة طرق، وغالبًا ما يُستخدَم في عمليات البتات المُقنّعة (bit mask operations) لتشفير البيانات وضغطها. لاحظ أن المثال التالي توضيحي، ولا ينبغي أن يُستخدم في الشيفرة النهائية (هناك طرق أفضل لتحقيق نفس النتيجة، مثل std::swap()‎). تستطيع استخدام عملية XOR لمبادلة متغيرين: int a = 42; int b = 64; // XOR المبادلة عبر a ^= b; b ^= a; a ^= b; std::cout << "a = " << a << ", b = " << b << "\n"; لإنجاز هذا، تحتاج إلى التحقق من إمكانية استخدامه. void doXORSwap(int & a, int & b) { // ينبغي إضافة عبارة للتحقق من أنك لا تبادل المتغير مع نفسه // وإلا ستجعل القيمة صفرية if ( & a != & b) { // XOR مبادلة a ^= b; b ^= a; a ^= b; } } ورغم أنها تبدو طريقة مناسبة للعزل إلا أنها ليست مفيدة في شيفرة الإنتاج، ذلك أن xor ليس عملية منطقية أساسية، بل مزيج من عمليات أخرى: a^c=~(a&c)&(a|c)‎. كذلك ، فإن المُصرفات التي صدرت بعد 2015 أتاحت إسناد قيم ثنائية إلى المتغيرات: int cn=0b0111; & - عامل AND البتّيّ إليك المثال التالي: int a = 6; // 0110b (0x06) int b = 10; // 1010b (0x0A) int c = a & b; // 0010b (0x02) std::cout << "a = " << a << ", b = " << b << ", c = " << c << std::endl; يكون ناتج الشيفرة السابقة: a = 6, b = 10, c = 2 وسبب ذلك أن عامل AND يعمل على مستوى البت، ويستخدم جدول الصحة البوليني التالي: TRUE AND TRUE = TRUE TRUE AND FALSE = FALSE FALSE AND FALSE = FALSE عندما يُطبق عامِل AND على القيمتين البتّيّتين ‎a ‎ (أي 0110)‎ و ‎b ‎ (أي 1010)‎ ، سنحصل على القيمة البتّيّة 0010: int a = 0 1 1 0 int b = 1 0 1 0 & --------- int c = 0 0 1 0 لا يغير عامِل AND قيمة المعامَل الأصلي إلا عند استخدام عامِل الإسناد البِتِّي المركب ‎&=‎: int a = 5; // 0101b (0x05) a &= 10; // a = 0101b & 1010b << - عملية الإزاحة اليسارية (left shift) إليك المثال التالي: int a = 1; // 0001b int b = a << 1; // 0010b std::cout << "a = " << a << ", b = " << b << std::endl; يكون ناتج ذلك هو: a = 1, b = 2 وتفسير ذلك أن عامِل الإزاحة اليساري يزيح بتَّات القيمة الموجودة على الجانب الأيسر (a) بالعدد المحدد على اليمين (1)، مع ملأ البتات الأقل أهمية (least significant bits) بأصفار، فمثلًا في حال إزاحة قيمة العدد 5 (تمثيله الثنائي 0000 0101) إلى اليسار أربعة منازل (على سبيل المثال ‎5 <<‎4)، سوف نحصل على القيمة 80 (تمثيلها الثنائي 0101 0000). قد تلاحظ أنّ إزاحة قيمة إلى اليسار بمنزلة واحدة يكافئ ضرب تلك القيمة بالعدد 2، على سبيل المثال: int a = 7; while (a < 200) { std::cout << "a = " << a << std::endl; a <<= 1; } a = 7; while (a < 200) { std::cout << "a = " << a << std::endl; a *= 2; } ولكن تجدر الإشارة إلى أنّ عملية الإزاحة اليسارية سوف تزيح جميع البتات إلى اليسار، بما في ذلك بتّ الإشارة، انظر إلى المثال التالي: int a = 2147483647; // 0111 1111 1111 1111 1111 1111 1111 1111 int b = a << 1; // 1111 1111 1111 1111 1111 1111 1111 1110 std::cout << "a = " << a << ", b = " << b << std::endl; سيكون الناتج: a = 2147483647, b = -2 وفي حين أنّ بعض المُصرِّفات ستعيد نتائج قد تبدو متوقعة غير أنه يجب ملاحظة أن إزاحة عددٍ ذا إشارة (signed number) بحيث تتأثر بتة الإشارة (sign bit)، فستكون النتيجة غير محددة (undefined). كذلك في حال كان عدد البتات التي ترغب في إزاحتها عددًا سالبًا، أو كان أكبر من عدد البتات التي يمكن أن يحملها النوع الموجود على اليسار، انظر: int a = 1; int b = a << -1; // سلوك غير محدد char c = a << 20; // سلوك غير محدد لا تغير الإزاحة البتّيّة اليسارية قيمة المعامَلات إلا في حال استخدام عامِل الإسناد البِتِّي المركب ‎<<=‎: int a = 5; // 0101b a <<= 1; // a = a << 1; >> - الإزاحة اليمينية (right shift) إليك المثال التالي: int a = 2; // 0010b int b = a >> 1; // 0001b std::cout << "a = " << a << ", b = " << b << std::endl; سيكون الناتج: a = 2, b = 1 وتفسير ذلك أن عامِل الإزاحة اليميني يزيح بتِّات القيمة الموجودة على الجانب الأيسر (a) بالعدد المحدد على اليمين (1)؛ وتجدر الإشارة إلى أنه رغم أنّ عملية الإزاحة اليمينية قياسية، فإنّ ما يحدث لبتات الإزاحة اليمينية في الأعداد السالبة ذات الإشارة (signed negative number) يختلف بحسب الاستخدام، ومن ثم لا يمكن ضمان كونها قابلة للنقل (portable)، انظر: int a = -2; int b = a >> 1; // على المصرّف b تعتمد قيمة كذلك سيكون ذلك السلوك غير محدد إن كان عدد البتات التي ترغب في إزاحتها سالبًا، على سبيل المثال: int a = 1; int b = a >> -1; // سلوك غير محدد لا يغيّر عامل الإزاحة اليميني قيمة المعامَل الأصلي إلا في حال استخدام عامِل الإسناد البِتِّي المركب ‎>>=‎: int a = 2; // 0010b a >>= 1; // a = a >> 1; هذا الدرس جزء من سلسلة دروس عن C++‎. ترجمة -وبتصرّف- للفصل Chapter 5: Bit Operators من كتاب C++ Notes for Professionals اقرأ أيضا الدرس 6: معالجة البتات والتلاعب بها الدرس 4: حسابيّات الأعداد العشرية
    1 نقطة
×
×
  • أضف...