عمليات البوابات المنطقية على الأرقام الثنائية

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

وقت القراءة: ≈ 10 دقائق

المقدمة

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

البوابات المنطقية الأساسية

هناك العديد من البوابات المنطقية لكن نحن سنركز في هذا الشرح على البوابات الأساسية وهي AND و OR و NOT و XOR

يمكننا بناء جدول يوضح لنا القيم المتوقعة لكل بوابة منطقية

الشرط الأول (A) الشرط الأول (B) A AND B A OR B NOT A NOT B A XOR B
true true true true false false false
true false false true false true true
false true false true true false true
false false false false true true false

لاحظ بعض النقاط المهمة هنا:


في المقالة العمليات الحسابية في البرمجة تحدثنا عن كيفية توظيف البوابات المنطقية مع القيم الـ boolean أي true و false وتعرفنا على && و || و ! و ^ وكيف نستخدم هذه الرموز في البرمجة للتحقق من صحة الشروط وتنفيذ العمليات التي تتعامل مع القيم الـ boolean

أما في هذه الفضفضة القصيرة سنتحدث عن نفس المفهوم لكن على مستوى الأرقام الصحيحة وكيف نحول الرقم الصحيح لرقم ثنائي وكيفية عمل العمليات عليهما

ما هي الأرقام الثنائية

الرقم الثنائي هو رقم مكون من الرقمين 0 و 1 فقط والنظام التي يتعامل بها الجهاز ويفهمها
أو اللغة التي اخترعناها لبناء حلقة وصل بيننا وبين الجهاز
بحيث أننا قمنا بتحديد إذا كان الرقم 1 يعني وجود تيار كهربائي يمر في الدائرة والرقم 0 يعني عدم وجود تيار كهربائي يمر في الدائرة
لأن الجهاز لا شيء سوى دوائر كهربائية تعمل بالتيار الكهربائي والتيار الكهربائي يمر أو لا يمر

برغم من بساطة الفكرة إلا أنها تعتبر الأساس لكل شيء في عالم الحاسوب والبرمجة
واستطعنا تمثيل الأرقام الصحيحة التي نعرفها بالأرقام الثنائية والتي تعتبر اللغة التي يفهمها الجهاز
فالرقم 2 في النظام الصحيح يكون 0010 في النظام الثنائي والرقم 5 يكون 0101 وهكذا

والجهاز عندما يرى 0101 يفهم أن هناك تيار كهربائي سيمر في الدائرة الأولى والثالثة فقط والباقي لن يمر فيها وهكذا قلنا للجهاز أنك عندما ترى هذا النمط من الأرقام 0101 فهذا يعني الرقم 5

الآن نحن كبشر كيف نعرف أن الرقم 0101 يعني الرقم 5 ؟

تحويل الأرقام الثنائية إلى صحيحة

هذه الطريقة تساعدنا على ترجمة الأرقام الثنائية إلى أرقام صحيحة والعكس
فمثلًا الرقم الثنائي 0101 يمثل الرقم الصحيح 5 كيف عرفنا ذلك؟

كل خانة تمثل الرقم 2 أس موقعها من اليمين إلى اليسار
بمعنى أن الخانة الأولى من ناحية اليمين تمثل 2 أس 0هكذا 2^0 والثانية تمثل 2^1 والثالثة تمثل 2^2 وهكذا
بالتالي لتحويل 0101 إلى رقم صحيح نقوم بضرب كل خانة بـ 2 أس موقعها ونجمع النواتج

نجمع كل النواتج التي حصلنا عليها 1 + 0 + 4 + 0 = 5 وهذا يعني أن الرقم الثنائي 0101 يمثل الرقم الصحيح 5


ماذا عن 1101101 ؟ هل تستطيع تحويله إلى رقم صحيح ؟

نجمع النواتج 1 + 0 + 4 + 8 + 0 + 32 + 64 + 0 = 109 وهذا يعني أن الرقم الثنائي 1101101 يمثل الرقم الصحيح 109

تحويل الأرقام الصحيحة إلى ثنائية

لكي نحول الرقم الصحيح إلى رقم ثنائي نقوم بالقسمة المتكررة على 2 ونحتفظ بباقي القسمة في كل خطوة
نكرر العملية حتى نحصل على الناتج 0 كرقم صحيح

مثال لنحول الرقم 13 إلى رقم ثنائي

سنقوم بقسمة 13 على 2 ونحتفظ بباقي القسمة في كل خطوة والذي سيكون 1 لأن 13 % 2 = 1 ثم ناتج القسمة الصحيح من 13 / 2 وهو 6 نقسمه على 2 وهكذا نكرر حتى نحصل على الناتج 0 كرقم صحيح

بما أن الناتج أصبح 0 فإننا نتوقف لأن 0 / 2 يعطينا 0 دائمًا وباقي القسمة يكون 0 أيضًا

نقوم بكتابة كل باقي قسمة جمعناها من اليمين لليسار لنحصل على الرقم الثنائي 1101 وهو يمثل الرقم الصحيح 13 فعلًا


مثال آخر لنحول الرقم 109 إلى رقم ثنائي

نقوم بكتابة الارقام التي جمعناها من اليمين لليسار لنحصل على الرقم الثنائي 1101101 وهو يمثل الرقم الصحيح 109 فعلًا

عمليات البوابات المنطقية على الأرقام الثنائية

هنا نأتي للجزء الأهم وهو كيفية عمل العمليات الأساسية على الأرقام الثنائية مثل AND و OR و NOT و XOR
هنا سنستخدم الرموز & و | و ~ و ^ لتطبيق هذه العمليات على مستوى الأرقام الثنائية

عملية الـ AND &

عملية الـ AND ترجع 1 عندما يكون كلا الرقمين الثنائيين يساويان 1 وترجع 0 في عندما يكون أحدهما أو كلاهما يساوي 0

1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0

لاحظ أنها تعطينا فقط 1 عندما يكون كلا الرقمين يساويان 1 وغير ذلك تعطينا 0 في باقي الحالات
حسنًا لنقم بعملية الـ AND على الرقمين 4 و 5

الرقم 4 نمثله في النظام الثنائي بـ 0100 والرقم 5 تمثله بـ 0101 نحن فقط نطبق العملية AND على كل خانة مع الخانة التي تقابلها

   0100
 & 0101
   ----
 = 0100

الناتج هو 0100 وهو يمثل الرقم 4
فقط قمنا مع كل خانة بتطبيق AND مع الخانة المقابلة له من الرقم الثاني وهكذا حتى نحصل على الناتج

مثال آخر لنقوم بعملية الـ AND على الرقمين 13 و 11

الرقم 13 نمثله في النظام الثنائي بـ 1101 والرقم 11 تمثله بـ 1011

   1101
 & 1011
   ----
 = 1001

الناتج هو 1001 وهو يمثل الرقم 9


هنا حيلة تستطيع تطبيقها مع الـ AND لمعرفة هل الرقم زوجي أو فردي

لنستعرض بعض الأرقام الصحيحة والتي يقابلها من الرقم الثنائي

ماذا تلاحظ ؟

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

لاحظ ماذا سيحدث عندما نقوم بعمل AND لأي رقم مع الرقم 1

هل لاحظت شيء؟
ستلاحظ أن الناتج يكون 1 فقط عندما يكون الرقم فردي وإلا يكون الناتج 0
هذا بسبب أن الرقم الصحيح 1 كل خاناته تساوي 0 ما عدا الخانة الأولى من ناحية اليمين والتي تساوي 1
بالتالي عندما نقوم بعمل AND لأي رقم مع الرقم 1 فإنها ترجم إلى أي رقم & 0001
هنا بسبب أن الرقم الصحيح 1 كل خاناته تساوي 0 ما عدا الخانة الأولى من ناحية اليمين فسيتم تصفير كل تلك الخانات
وكل ما ستقوم به العملية هو تحقق الخانة الأولى من ناحية اليمين فقط

هل تستطيع معرفة إذا كان الرقم 01101010100101010101 زوجي أم فردي بلمح البصر ؟
أنت هنا لن تبالي بكمية الخانة أن تعلم أنها سيتم تصفيرها عندما تقوم بعمل AND مع الرقم 1
لذا أنت فقط ستقوم بحساب AND مع أول خانة من ناحية اليمين وباقي الخانات أن تعلم أنها ستصفر

   01101010100101010101
 & 00000000000000000001
   --------------------
 = 00000000000000000001

لذا الرقم 01101010100101010101 هو رقم فردي برغم من أنا لا نعلم كم يساوي

عملية الـ OR |

عملية الـ OR ترجع 1 عندما يكون أحد الرقمين الثنائيين يساوي 1 وترجع 0 في حالة كان كلا الرقمين يساويان 0

1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0

لاحظ أنها تعطينا 1 عندما يكون أحد الرقمين يساوي 1 وغير ذلك تعطينا 0 في باقي الحالات
حسنًا لنقوم بعملية الـ OR على الرقمين 4 و 5

الرقم 4 نمثله في النظام الثنائي بـ 0100 والرقم 5 تمثله بـ 0101
هنا سنطبق العملية OR على كل خانة مع الخانة التي تقابلها

   0100
 | 0101
   ----
 = 0101

الناتج هو 0101 وهو يمثل الرقم 5
مثال آخر لنقوم بعملية الـ OR على الرقمين 13 و 11

الرقم 13 نمثله في النظام الثنائي بـ 1101 والرقم 11 تمثله بـ 1011

   1101
 | 1011
   ----
 = 1111

الناتج هو 1111 وهو يمثل الرقم 15

عملية الـ XOR ^

عملية الـ XOR ترجع 1 عندما يكون الرقمين الثنائيين غير متساويين وترجع 0 في حالة كان الرقمين متساويين

1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0

لاحظ أنها تعطينا 1 عندما يكون الرقمين غير متساويين وعندما يتساويان تعطينا 0 في باقي الحالات
لنجرب تطبيق عملية الـ XOR على الرقمين 4 و 5

الرقم 4 نمثله في النظام الثنائي بـ 0100 والرقم 5 نمثله بـ 0101

   0100
 ^ 0101
   ----
 = 0001

الناتج هو 0001 وهو يمثل الرقم 1

مثال آخر لنقم بعملية الـ XOR على الرقمين 13 و 11

الرقم 13 نمثله في النظام الثنائي بـ 1101 والرقم 11 نمثله بـ 1011

   1101
 ^ 1011
   ----
 = 0110

الناتج هو 0110 وهو يمثل الرقم 6


عليك فهم شيء أساسي وهو أن الـ XOR تعطينا 1 عندما يكون الرقمين غير متساويين وتعطينا 0 عندما يكونا متساويين
بالتالي عندما نقول 13 ^ 11 ^ 11 الناتج سيكون 13
لأن 11 تكرر مرتين بالتالي 11 ^ 11 تعطينا 0 لأن الـ XOR تعطينا 0 عندما يكون الرقمين متساويين

هذه الفكرة تساعدنا في عمل تطبيقات مفيدة بالـ XOR منها التشفير البسيط
فمثلا أريد تشفير هذا الرقم 24
أولًا لنختر رقمًا عشوائيًا ليكون مفتاح التشفير وليكن 1258

الآن عندما نقوم بعمل 24 ^ 1258 سيعطينا الناتج 1240 ويمكنك اعتبار أن الرقم 24 تم تشفيره وأصبح 1240 ولكي تفك تشفيره وترجعه للرقم الأصلي الذي كان عليه تقوم بعمل 1240 ^ 1258 وستجد أن الناتج هو 24

int myNumber = 24;
int key = 1258;

int encryptedNumber = myNumber ^ key;
// encryptedNumber = 1240

int decryptedNumber = encryptedNumber ^ key;
// decryptedNumber = 24

عملية الـ NOT ~

عملية الـ NOT تعكس كل خانة في الرقم الثنائي، أي أن 1 يصبح 0 و0 يصبح 1

~1 = 0
~0 = 1

لنجرب تطبيق عملية الـ NOT على الرقم 4
الرقم 4 نمثله في النظام الثنائي بـ 0100

~ 0100
  ----
  1011

الناتج هو 1011، ولكن يجب الانتباه إلى أن عملية الـ NOT قلبت كل 0 لـ 1 في الرقم بما في ذلك الأصفار التي لا تظهر في التمثيل الأساسي للرقم
بمعنى أن 0100 تساوي 4 و 00100 تساوي 4 و 000100 تساوي 4 وهكذا
مهما أضفنا أصفار على اليسار فذلك لا يؤثر على الرقم

لذا عندما نقوم بعملية الـ NOT على الرقم 4 يساوي قد تظنه 1011 لكن في الحقيقة أشبه بـ 11111111111111111111111111111011 وتعداد الـ 1 على اليسار ليس له نهاية
مثل ما كان في هناك عدد لا نهائي من الأصفار على اليسار

فعندما نقوم بعمل:

~ 0100
  ----
  1011

فالشكل الحقيقي سيكون هكذا

~ 00000000000000000000000000000100
  --------------------------------
  11111111111111111111111111111011

عندما يكون هناك عدد لا نهائي في الـ 1 على اليسار فهذا يعني أن الرقم يكون سالبًا
وهذا يعني أن الرقم 4 بعد عملية الـ NOT يصبح -5 وليس 11 كما كنت تظن

كيف تفرق اللغات من أن العدد سالب أم موجب ؟

إذا كيف تحدد اللغات هل 1011 هو الرقم 11 أم -5 ؟
لا توجد طريقة بمجرد النظر تعرف هل الرقم سالب أم موجب
أنت عليك اخبار اللغة كيف تتعامل مع موقف هكذا

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

اذا جعلت اللغة تراعي الأعداد السالبة فإن الرقم 1011 سيعني لها -5 وإذا جعلتها لبا تراعي الاعداد السالبة فإنه سيعني ها 11

حيلة عن الـ NOT

عندما نقوم بعمل NOT على الرقم 4 نحصل على 1011
إذا كنت تريد معرفة القيمة السالبة لهذا الرقم فقط قم بعمل NOT مرة أخرى واجمع عليه 1
بالتالي ~1011 = 0100 و 0100 هو الرقم 4 اجمع عليه 1 وسنحصل على 5 إذا قيمة الرقم الثنائي 1011 السالبة سيكون الرقم -5

عندما أعطيك رقم كـ 1111 وقلت لك انه رقم سالب هل تستطيع معرفة قيمته ؟
فقط قم بعمل NOT عليه واجمع عليه 1 وستحصل على القيمة السالبة لهذا الرقم
بالتالي ~1111 = 0000 و 0000 هو الرقم 0 اجمع عليه 1 وسنحصل على 1 إذا قيمة الرقم الثنائي 1111 السالبة ستكون -1

هذه الطريقة لمعرفة الرقم السالب تسمى Two's Complement
وهي طريقة تستخدم في البرمجة لتمثيل الأعداد السالبة بفرض أن الرقم الذي في أقصى اليسار يحدد إذا كان الرقم سالب أم موجب

وهناك حيلة بسيطة أخرى هنا:

هل تلاحظ النمط ؟
عندما نقوم بعمل NOT على الرقم n فإن الناتج يكون (n + 1) * -1

الختام

في النهاية، تعلمنا كيف تعمل البوابات المنطقية على مستوى الأرقام الثنائية وكيفية تطبيق العمليات الأساسية مثل AND، OR، XOR، وNOT على الأرقام الثنائية
وكيف يمكننا تحويل الأرقام الصحيحة إلى ثنائية والعكس وكيفية تحويل الأرقام الثنائية إلى صحيحة والعكس
وهناك المزيد من التطبيقات والأفكار والعمليات مثل كيف تجمع وتطرح وتضرب الأرقام الثنائية لكن لم أكن أريد أن أتطرق لها في هذه الفضفضة البسيطة