الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

معاملات التعامل بالنظام الثنائي Bitwise & Shift Op

مغلق
بدأه الحسين في 25 ديسمبر 2004 · 6 رد · 1,512 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

معاملات التعامل بالنظام الثنائي Bitwise & Shift Operators

قبل الحديث عن معاملات النظام الثنائي دعني أخذك لنري لمحات في عالم الثنائيات أو نظام العد الثنائي

ولا أخفي علي اي مبتدء في عالم البرمجيات أو ربما المتوسطين أيضا أن دخول هذا المنعطف ربما لا يكون سهل ولكن دعنا نتوكل علي الله فهو خيرا معين .

النظام الثنائي

هو أحد أنظمة العد مثل النظام العشري المعتاد لنا .

لكن النظام الثنائي يعتمد علي رقمين فقط وهما الواحد و الصفر .

وهذا النظام العددي تم إستخدامه لبرمجة الحواسب في بدايات تطوير برامج للحاسبات بما كان يعرف بلغة الألة machine language وذلك لان وحدات بناء الحاسب تتعامل في حساباتها بالنظام الثنائي ( لان الوحدة الإلكترونية لا تستطيع تميز إلا حالتان وهما وجود إشارة إليكترونية نتيجة إغلاق الدائرة الإلكترونية , وعدم وجود إشارة نتيجة فتح الدائرة الإلكترونية ) .

فإن كنا نريد تمثيل الأعداد ولا نملك إلا رقمين فقط وهما 1 والـ 0

لذلك قياسا علي ما تعلمناه في النظام العشري عندما نريد تمثيل العدد عشرة نقوم بعملية دمج الرقمين 1 و 0

وعند تمثيل العدد الحادي عشر نقوم بدمج الرقمين 1 و 1 وهكذا عندما نخرج عن نطاق نظام العد .

وبما أن النظام الثنائي لا يتميز إلا برقمين فقط فعندما نريد تمثيل العدد أثنين نقوم بدمج الرقمين 1 و 0 وهكذا

فالعدد العشري 2 يمثل في النظام الثنائي كما يلي 10

والعدد العشري 3 يمثل في النظام الثنائي كما يلي 11

وهكذا ...

وتوجد أساليب رياضية لن نتطرق لها تستخدم في التحويل بين أنظمة العد المختلفه .

معاملات التعامل بالبت Bitwise Operators

تستخدم للتعامل مع القيمة الثنائية لكلا الطرفين

وعمل مقارنه منطقية لكل بت علي حدي كما سيتضح فيما يلي :

• & :

تتعامل مثل المعامل المنطقي &&

ولكن تتعامل ليس بالقيمة الكلية للطرفين ولكن تتم المقارنة علي مستوي البت , بت واحد تلو الأخر .

• | :

تتعامل مثل المعامل المنطقي ||

ولكن تتعامل ليس بالقيمة الكلية للطرفين ولكن تتم المقارنة علي مستوي البت , بت واحد تلو الأخر .

• ~ :

تتعامل مثل المعامل المنطقي !

ولكن تتعامل ليس بالقيمة الكلية ولكن تتم المقارنة علي مستوي البت , بت واحد تلو الأخر .

• ^ :

تتعامل بمفهوم الـ XOR مثل المعامل المنطقي || ولكن

تقوم بإرجاع القيمة true عندما يكون احدي طرفي المقارنة يساوي true وغير ذلك سوف يؤدي إلي إرجاع القيمة false كما يلي :

الناتج القيمة القيمة

False True True

True False True

True True False

False False False

مثال :

    echo( 2 & 3 );

ويكون الناتج كما يلي : 2

تفسير الناتج كما يلي :

كما نعلم أن العدد 2 في النظام العشري يقابل العدد 10 في النظام الثنائي

و العدد 3 في النظام العشري يقابل العدد 11 في النظام الثنائي

فسوف يتم مقارنه القيم الثنائية للعددين 2 و 3

حيث سوف يتم مقارنه كل بت علي حدي بالترتيب مع البت المقابل له للعدد الأخر

فسوف يتم مقارنة العدد 0 مع 1 من خلال المعامل & ويكون الناتج 0

ثم يتم مقارنة العدد 1 مع 1 من خلال المعامل & ويكون الناتج 1

(لاحظ أن الصفر يعبر عن القيمة False والواحد يعبر عن القيمة True)

لذلك ينتج من هذه العملية العدد الثنائي 10 وهو يقابل العدد 2 في النظام العشري

يوضح الشكل التالي هذه العملية

0 1 :2

1 1 :3

_________________

0 1 2

مثال :

    echo( 2 | 3 );

ويكون الناتج كما يلي : 3

تفسير الناتج كما يلي :

0 1 :2

1 1 :3

_________________

1 1 3

مثال :

    echo( 2 ^ 3 );

ويكون الناتج كما يلي : 1

تفسير الناتج كما يلي :

0 1 :2

1 1 :3

_________________

1 0 1

أما معاملات الإزاحة Shift Operators

تستخدم لعمل أزاحة ( تحريك ) للبتات bits إلي اليمين أو اليسار حسب نوع الإزاحة كما يلي

• >> :

تقوم بعمل إزاحة ناحية اليمين لعدد من البتات يكافيء مقادر قيمة الطرف الأيمن لقيمة العدد بالطرف الأيسر

• << :

تقوم بعمل إزاحة ناحية اليسار لعدد من البتات يكافيء مقادر قيمة الطرف الأيمن لقيمة العدد بالطرف الأيسر

مثال :

    $num = 6;

    $num1 = $num >> 1;
    echo( "num1 : " + $num1 );

    $num2 = $num >> 2;
    echo( "num2 : " + $num2 );

ويكون الناتج كما يلي :

num1 : 3

num2 : 1

وتفسير الناتج كما يلي :

يمثل العدد 6 بالعدد 110 بالنظام الثنائي , فعند إزاحة هذا العدد الثنائي ناحية اليمين بمقدار بت واحد سوف يصبح كالتالي 11 اي ما يكافئ العدد 3 بالنظام العشري

وإذا تم إزاحة بمقدار بت أخر جهة اليمين يكون العدد كالتالي 1 اي ما يعادل 1 بالنظام العشري

كما يتضح بالشكل التالي :

shiftOpExam.gif

مثال :

    $num = 6;

    $num1 = $num << 1;
    echo( "num1 : " + $num1 );

    $num2 = $num << 2;
    echo( "num2 : " + $num2 );

ويكون الناتج كما يلي :

num1 : 12

num2 : 24

وتفسير الناتج كما يلي :

يمثل العدد 6 بالعدد 110 بالنظام الثنائي , فعند إزاحة هذا العدد الثنائي ناحية اليسار بمقدار بت واحد سوف يصبح كالتالي 1100 اي ما يكافئ العدد 12 بالنظام العشري

وإذا تم إزاحة بمقدار بت أخر جهة اليمين يكون العدد كالتالي 11000 اي ما يعادل 24 بالنظام العشري

مثال تطبيقي لهذا الدرس

نود عمل دالة تقوم بتحويل الأعداد من النظام العشري إلي النظام الثنائي

وسوف تعتمد الفكرة علي التالي :

- معرفة قيمة البت الأول للعدد هل 1 أم 0 وذلك من خلال إستخدام المعامل & , حيث نقوم بإجراء العملية التالية

العدد المراد تحويله & 1

ناتج هذه العملية سوف يكون قيمة البت الأول فقط لأن العدد 1 يمثل بالنظام الثنائي كما يلي 00000001 (وبالطبع هذه الأصفار لا تغير شئ من قيمة الواحد لأنها علي يسار العدد ويختلف عددها علي حسب حجم هذا المتغير بالذاكرة)

لذلك عند مقارنة البتات التي تلي البت الأول مع الصفر سوف يكون ناتج هذا البت هو صفر أيا كان البت قيمة 1 أو 0

لذلك سوف نستطيع معرفة قيمة أول بت هل هي صفر أم واحد

- ثم نقوم بعد ذلك بعمل إزاحة لقيمة هذا العدد ناحية اليمين بمقدار بت واحد (الذي تم معرفة قيمتة) وبذلك يكون البت الثاني الأن في موضع البت الأول

ومن ثم نقوم بإعادة عملية المعامل & لمعرفة قيمة هذا البت هل 1 أم 0 وهكذا حتي يكون العدد الناتج من عملية الإزاحة يساوي صفر

وإليكم الكود

<?
function DecimalToBinary($decimalNumber) {
    $binaryString = "";
    do {
        $binaryString = ( $decimalNumber & 1 ) . $binaryString;
    }while( $decimalNumber >>= 1 );

    return $binaryString;
}

echo DecimalToBinary(2) . "<br>";
echo DecimalToBinary(3) . "<br>";
echo DecimalToBinary(8);
?>

وبالله التو فيق

والسلام عليكم ورحمة الله وبركاته

تم تعديل هذه المشاركة بواسطة الحسين في 25 ديسمبر 2004 في 04:54

29_5.gif

سورة العنكبوت

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

مشروع Arabic PHP.NET

حلم طالما كان يراودني حتي قهرته بحمد الله ليكون حقيقة

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

سلسلة أنماط التصاميم البرمجية Desgin Patterns

سلسلة أنماط التصاميم البرمجية Desgin Patterns | كتيب هذه الدروس (إعداد أحمد غريب)

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

كنترول ASP.NET DataGrid CheckBoxColumn

كنترول ProgressBar

كنترول UltraPanel

مشروع الكنترول الأنيق (إهداء للفريق العربي)

الورش الإلكترونية IT Workshops

تعقب الأخطاء error tracing

كنترول ColorPicker لمطوري الويب

RichTextBox Control لمطوري ال ASP.Net

حمل كتاب جافا سكربت عربي

#2

جزاك الله خير درس ممتع ومفيد

سأحاول الآن فهم الموضع الآخر ،

#3

بسم الله الرحمن الرحيم

تمرين

بناء علي هذا الدرس

لدي تمرين بسيط

المطلوب عمل دالة باسم GetTextLength

حيث تقوم بأخذ نص ما ثم تعيد طول هذا النص اي عدد الأحرف التي يتكون منها هذا النص

علما بأن الحرف الواحد character يشغل مساحة تخزينية 8 بت

الشكل العام لهذه الدالة

function GetTextLength( $text ) {
   ......
}

طبعا محدش يستخدم دالة strlen أو ما شابه ذلك

أرجو الإعتماد علي المعاملات الثنائية ومعاملات الإزاحة

وبالله التوفيق

والسلام عليكم

تم تعديل هذه المشاركة بواسطة الحسين في 27 ديسمبر 2004 في 21:41

29_5.gif

سورة العنكبوت

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

مشروع Arabic PHP.NET

حلم طالما كان يراودني حتي قهرته بحمد الله ليكون حقيقة

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

سلسلة أنماط التصاميم البرمجية Desgin Patterns

سلسلة أنماط التصاميم البرمجية Desgin Patterns | كتيب هذه الدروس (إعداد أحمد غريب)

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

كنترول ASP.NET DataGrid CheckBoxColumn

كنترول ProgressBar

كنترول UltraPanel

مشروع الكنترول الأنيق (إهداء للفريق العربي)

الورش الإلكترونية IT Workshops

تعقب الأخطاء error tracing

كنترول ColorPicker لمطوري الويب

RichTextBox Control لمطوري ال ASP.Net

حمل كتاب جافا سكربت عربي

#4
$a='hello'
$count=0;
while(a){
a>>=1;
++$count;
};
$result=count\8;

لا أدري لماذا لا يعمل الكود السابق بشكل صيح ، مع أنه منطقياً صحيح ،

يبدو أن المشكلة في النوع string فقد يكون مؤشر كما في السي :blink:

#5

المعاملات الثنائية ومعاملات الإزاحة تعمل فقط مع الأعداد الصحيحة

في جميع لغات البرمجة

تنوية:

يمكنك كتابة class في أحد لغات البرمحة التي تدعم إعادة تنفيد overlaod للمعاملات

مثل C++ أو C#

لنوع string

#6

بسم الله الرحمن الرحيم

المعاملات الثنائية ومعاملات الإزاحة تعمل فقط مع الأعداد الصحيحة

في جميع لغات البرمجة

فعلا هذه معلومة صحيحة , مشكورا أخي موسي

إلا أن لغة ال php تدعم تعامل النصوص مع المعاملات الثنائية Bitwise operators

حل التمرين السابق

<?
function GetTextLength( $text ) {
    $text ^= $text;

    $charCount = 0;
    $compareText = "";
    while( $text != $compareText ) {
        $compareText .= "\0";
        $charCount++;
    }

    return $charCount;
}

echo GetTextLength("c12");
?>

والسلام عليكم

29_5.gif

سورة العنكبوت

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

مشروع Arabic PHP.NET

حلم طالما كان يراودني حتي قهرته بحمد الله ليكون حقيقة

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

سلسلة أنماط التصاميم البرمجية Desgin Patterns

سلسلة أنماط التصاميم البرمجية Desgin Patterns | كتيب هذه الدروس (إعداد أحمد غريب)

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

كنترول ASP.NET DataGrid CheckBoxColumn

كنترول ProgressBar

كنترول UltraPanel

مشروع الكنترول الأنيق (إهداء للفريق العربي)

الورش الإلكترونية IT Workshops

تعقب الأخطاء error tracing

كنترول ColorPicker لمطوري الويب

RichTextBox Control لمطوري ال ASP.Net

حمل كتاب جافا سكربت عربي

#7

اخ حسين ياليت ، تشرح الموضوع بشوية تفصيل

يعني أليست string مصفوفة ؟

الا يكون اسم المصفوفة مؤشر على أول عنصر منها؟

كيف عمل الكود: $text^=$text؟

انا فاهم طريقة الحل لكن النقاط الساقبه محيرتني؟

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…