عمليات البوابات المنطقية على الأرقام الثنائية
السلام عليكم ورحمة الله وبركاته
الفهرس
المقدمة
عندما نتكلم عن البوابات المنطقية ونحن نتحدث مجموعة من الرموز والعمليات تستخدم للتعامل مع الأرقام الثانية مثل 0
و 1
، وهذه العمليات تعتبر من العمليات الأساسية في علم الحاسوب وتستخدم بكثرة في تصميم الدوائر الإلكترونية والبرمجة
البوابات المنطقية الأساسية
هناك العديد من البوابات المنطقية لكن نحن سنركز في هذا الشرح على البوابات الأساسية وهي AND
و OR
و NOT
و XOR
AND
: تستخدم للتحقق من صحة شرطين معًا وتعطيكtrue
إذا كان الشرطين صحيحين وتعطيكfalse
إذا كان أحدهما خطأOR
: تستخدم للتحقق من صحة شرطين معًا وتعطيكtrue
إذا كان أحد الشرطين صحيح وتعطيكfalse
إذا كان الشرطين خطأNOT
: تستخدم لعكس الشرط وتعطيكtrue
إذا كان الشرط خطأ وتعطيكfalse
إذا كان الشرط صحيحXOR
: تعطيكtrue
إذا كان صحة الشرطين متعاكسين وتعطيكfalse
إذا كان الشرطين متساويين
يمكننا بناء جدول يوضح لنا القيم المتوقعة لكل بوابة منطقية
الشرط الأول (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 |
لاحظ بعض النقاط المهمة هنا:
AND
تعطيكtrue
فقط عندما يكون كلا الشرطين معًا يعطيانtrue
وإلا تعطيكfalse
إذا كان أحدهما يعطيكfalse
OR
تعطيكtrue
عندما يكون على الأقل أحد الشرطين يعطيكtrue
وتعطيكfalse
فقط عندما يكون كلا الشرطين يعطيانكfalse
NOT
مجرد أنها تعكس نتيجة الشرط فإذا كان الشرطtrue
تعطيكfalse
وإذا كان الشرطfalse
تعطيكtrue
XOR
تعطيكtrue
فقط عندما يكون الشرطين متعاكسين أي أحدهماtrue
والآخرfalse
وتعطيكfalse
عندما يكون الشرطين متساويين بمعنى أن كلاهما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
لذا عند ضربها بـ2^0
يكون الناتج1 * 2^0 = 1
- الخانة الثانية قيمتها
0
لذا عند ضربها بـ2^1
يكون الناتج0 * 2^1 = 0
- الخانة الثالثة قيمتها
1
لذا عند ضربها بـ2^2
يكون الناتج1 * 2^2 = 4
- الخانة الرابعة قيمتها
0
لذا عند ضربها بـ2^3
يكون الناتج0 * 2^3 = 0
نجمع كل النواتج التي حصلنا عليها 1 + 0 + 4 + 0 = 5
وهذا يعني أن الرقم الثنائي 0101
يمثل الرقم الصحيح 5
ماذا عن 1101101
؟ هل تستطيع تحويله إلى رقم صحيح ؟
- الخانة الأولى
1
نضربها بـ2^0
يعطينا1
- الخانة الثانية
0
نضربها بـ2^1
يعطينا0
- الخانة الثالثة
1
نضربها بـ2^2
يعطينا4
- الخانة الرابعة
1
نضربها بـ2^3
يعطينا8
- الخانة الخامسة
0
نضربها بـ2^4
يعطينا0
- الخانة السادسة
1
نضربها بـ2^5
يعطينا32
- الخانة السابعة
1
نضربها بـ2^6
يعطينا64
نجمع النواتج 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
كرقم صحيح
13 / 2 = 6.5
باقي القسمة1
و العدد الصحيح6
6 / 2 = 3
باقي القسمة0
و العدد الصحيح3
3 / 2 = 1.5
باقي القسمة1
و العدد الصحيح1
1 / 2 = 0.5
باقي القسمة1
و العدد الصحيح0
بما أن الناتج أصبح 0
فإننا نتوقف لأن 0 / 2
يعطينا 0
دائمًا وباقي القسمة يكون 0
أيضًا
نقوم بكتابة كل باقي قسمة جمعناها من اليمين لليسار لنحصل على الرقم الثنائي 1101
وهو يمثل الرقم الصحيح 13
فعلًا
مثال آخر لنحول الرقم 109
إلى رقم ثنائي
109 / 2 = 54.5
باقي القسمة1
و العدد الصحيح54
54 / 2 = 27.5
باقي القسمة0
و العدد الصحيح27
27 / 2 = 13.5
باقي القسمة1
و العدد الصحيح13
13 / 2 = 6.5
باقي القسمة1
و العدد الصحيح6
6 / 2 = 3
باقي القسمة0
و العدد الصحيح3
3 / 2 = 1.5
باقي القسمة1
و العدد الصحيح1
1 / 2 = 0.5
باقي القسمة1
و العدد الصحيح0
نقوم بكتابة الارقام التي جمعناها من اليمين لليسار لنحصل على الرقم الثنائي 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
لمعرفة هل الرقم زوجي أو فردي
لنستعرض بعض الأرقام الصحيحة والتي يقابلها من الرقم الثنائي
1
تمثله0001
2
تمثله0010
3
تمثله0011
4
تمثله0100
5
تمثله0101
6
تمثله0110
7
تمثله0111
8
تمثله1000
9
تمثله1001
- ... إلخ
ماذا تلاحظ ؟
ستلاحظ أن الأرقام الزوجية تكون الخانة الأولى من اليمين تساوي 0
والأرقام الفردية تكون الخانة الأولى تساوي 1
بمعنى أننا نحتاج لوسيلة للتحقق من الخانة الأولى فقط لمعرفة إذا كان الرقم زوجي أو فردي
فإذا كانت الخانة الأولى تساوي 1
فهذا يعني أن الرقم فردي وإذا كانت تساوي 0
فهذا يعني أن الرقم زوجي
لاحظ ماذا سيحدث عندما نقوم بعمل AND
لأي رقم مع الرقم 1
1 & 1
تساوي0001 & 0001
تساوي0001
2 & 1
تساوي0010 & 0001
تساوي0000
3 & 1
تساوي0011 & 0001
تساوي0001
4 & 1
تساوي0100 & 0001
تساوي0000
5 & 1
تساوي0101 & 0001
تساوي0001
6 & 1
تساوي0110 & 0001
تساوي0000
7 & 1
تساوي0111 & 0001
تساوي0001
8 & 1
تساوي1000 & 0001
تساوي0000
9 & 1
تساوي1001 & 0001
تساوي0001
- ... إلخ
هل لاحظت شيء؟
ستلاحظ أن الناتج يكون 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
وهي طريقة تستخدم في البرمجة لتمثيل الأعداد السالبة بفرض أن الرقم الذي في أقصى اليسار يحدد إذا كان الرقم سالب أم موجب
وهناك حيلة بسيطة أخرى هنا:
~0 = -1
~1 = -2
~2 = -3
~3 = -4
~4 = -5
~5 = -6
~6 = -7
- ... إلخ
هل تلاحظ النمط ؟
عندما نقوم بعمل NOT
على الرقم n
فإن الناتج يكون (n + 1) * -1
الختام
في النهاية، تعلمنا كيف تعمل البوابات المنطقية على مستوى الأرقام الثنائية وكيفية تطبيق العمليات الأساسية مثل AND
، OR
، XOR
، وNOT
على الأرقام الثنائية
وكيف يمكننا تحويل الأرقام الصحيحة إلى ثنائية والعكس وكيفية تحويل الأرقام الثنائية إلى صحيحة والعكس
وهناك المزيد من التطبيقات والأفكار والعمليات مثل كيف تجمع وتطرح وتضرب الأرقام الثنائية لكن لم أكن أريد أن أتطرق لها في هذه الفضفضة البسيطة