بسم الله الرحمن الرحيم
معاملات التعامل بالنظام الثنائي 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 بالنظام العشري
كما يتضح بالشكل التالي :

مثال :
$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);
?>وبالله التو فيق
والسلام عليكم ورحمة الله وبركاته
