النظام الثنائي والنظام الثماني والنظام السادس عشر (المعروف أيضًا بـ hex) هي أنظمة عد مختلفة ذات أسس مختلفة. النظام الثنائي أساسه 2، والنظام الثماني أساسه 8، والنظام السادس عشر أساسه 16. الأعداد الصحيحة العادية في Python أساسها 10. والأنظمة الثلاثة كلها تمثيلات للأعداد الصحيحة. أي أنها تمثّل الأعداد الموجبة والسالبة (بما فيها الصفر) دون كسور أو فواصل عشرية، وتدعم كل العمليات التي يمكننا إجراؤها على الأعداد الصحيحة.
النظام الثنائي هو نظام عد أساسه 2، يستخدم الرقمين 0 و1 فقط. وهو يمثّل عادةً حالتَي 0 ("إيقاف") و1 ("تشغيل") لمرور التيار الكهربائي عبر الترانزستورات والمفاتيح في الحواسيب، وكذلك الشحنات الموجبة والسالبة في وسائط التخزين المغناطيسي. ويستطيع النظام الثنائي تمثيل كل الأعداد الصحيحة المستخدمة في الأساس 10.
جزء من نظام الأساس 2 يبدو هكذا، مع أنه يستمر بلا نهاية ولا يتوقف عند 128:
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 2 ** 7 | 2 ** 6 | 2 ** 5 | 2 ** 4 | 2 ** 3 | 2 ** 2 | 2 ** 1 | 2 ** 0 |
فإذا أردنا تمثيل العدد 6 في النظام الثنائي، سيكون 110.
| قيمة المنزلة | 4 | 2 | 1 |
|---|---|---|---|
| العدد الثنائي | 1 | 1 | 0 |
وتكون العملية: 4 + 2 + 0 = 6
مثال آخر: 19
| قيمة المنزلة | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|
| العدد الثنائي | 1 | 0 | 0 | 1 | 1 |
ويكون العدد الثنائي: 10011
وتكون العملية: 16 + 0 + 0 + 2 + 1 = 19
في Python، يمكننا تمثيل القيم الثنائية الحرفية باستخدام السابقة 0b.
فإذا كتبنا 0b10011، فسيفسّره Python على أنه عدد ثنائي ويحوّله إلى الأساس 10.
>>> 0b10011
19
>>> type(0b10011)
<class 'int'>
النظام الثنائي في Python ليس إلا أسلوبًا مختلفًا لكتابة عدد صحيح، ولذلك فإن التمثيل الثنائي هو عدد صحيح في كل العمليات الرياضية.
إذا كتبت عددًا بسابقة 0b لا ينتمي إلى النظام الثنائي، فسيرفع استثناء SyntaxError.
Traceback (most recent call last):
File "c:\binary.py", line 1, in <module>
0b10211
SyntaxError: invalid digit '2' in binary literal
بما أن الأعداد الثنائية أعداد صحيحة، يمكننا إجراء كل العمليات عليها كما نجريها على الأعداد الصحيحة.
# addition
>>> 0b10011 + 0b10011
38
# multiplication
>>> 0b10011 * 0b10011
361
ويمكننا أيضًا إجراء عمليات بين التمثيلين الثنائي والصحيح معًا.
لكن قواعد العوامل الرياضية المعتادة تظل سارية: قسمة عددين ثنائيين أو عددين صحيحين ستُرجع قيمة من نوع float، حتى لو لم ينتج عن القسمة جزء عشري.
>>> 0b10011 + 19
38
>>> 0b10011/0b10011
1.0
>>> 0b10011/3
6.333333333333333
سيحوّل Python القيمة الثنائية الحرفية تلقائيًا إلى int.
ولتحويل قيمة int إلى تمثيل ثنائي، استخدم الدالة المدمجة [bin()][bin].
ستُرجع bin() قيمة من نوع str مكافئة للعدد بالتمثيل الثنائي، مع السابقة 0b.
>>> bin(19)
'0b10011'
لتحويل قيمة ثنائية حرفية إلى عدد صحيح، يمكننا استخدام الدالة المدمجة int()، وتمرير سلسلة نصية بالتمثيل الثنائي ووسيط الأساس:
>>> int("0b10011", 2)
19
وإعطاء أساس خاطئ (أو تمثيل ثنائي غير صالح) سيرفع ValueError:
Traceback (most recent call last):
File "c:\binary.py", line 4, in <module>
int("0b10011", 3)
ValueError: invalid literal for int() with base 3: '0b10011'
هناك أيضًا بعض الطرق الخاصة التي يمكننا استخدامها مع الأعداد الثنائية.
ستُرجع <int>.bit_length() عدد البِتات اللازمة لتمثيل العدد:
>>> 0b11011.bit_length()
5
ستُرجع <int>.bit_count() عدد الآحاد في العدد الثنائي.
على سبيل المثال، ستُرجع bit_count() على '0b11011' القيمة 4:
>>> 0b11011.bit_count()
4
إذا كنت تعمل محليًا، فإن bit_count() يتطلب Python 3.10 على الأقل.
محرر Exercism الإلكتروني يدعم حاليًا كل الميزات حتى Python 3.11.
النظام الثماني هو نظام عد أساسه 8. ويستخدم الأرقام 0 و1 و2 و3 و4 و5 و6 و7.
في Python، يمكننا تمثيل الأعداد الثمانية باستخدام السابقة 0o.
وكما في النظام الثنائي، يحوّل Python التمثيل الثماني تلقائيًا إلى int.
>>> 0o123
83
وكما في النظام الثنائي، فإن الأعداد الثمانية هي أعداد صحيحة وتدعم كل عمليات الأعداد الصحيحة.
وإضافة السابقة 0o إلى عدد لا ينتمي إلى النظام الثماني سترفع SyntaxError.
لتحويل قيمة int إلى تمثيل ثماني، يمكنك استخدام الدالة المدمجة [oct()][oct].
وهي تعمل بشكل مشابه للدالة bin()، إذ تُرجع سلسلة نصية:
>>> oct(83)
'0o123'
لتحويل عدد ثماني إلى عدد صحيح، يمكننا استخدام الدالة int()، بتمرير سلسلة نصية بالتمثيل الثماني والأساس (8) كوسائط:
>>> int("0o123", 8)
83
وكما في النظام الثنائي، فإن إعطاء أساس خاطئ سيرفع ValueError.
النظام السادس عشر هو نظام عد أساسه 16. ويستخدم الأرقام من 0 إلى 9 والحروف A وB وC وD وE وF. حيث A يساوي 10، وB يساوي 11، وC يساوي 12، وD يساوي 13، وE يساوي 14، وF يساوي 15.
يمكننا تمثيل الأعداد السادسة عشرية في Python باستخدام السابقة 0x.
وكما في النظامين الثنائي والثماني، يحوّل Python القيم السادسة عشرية الحرفية تلقائيًا إلى int.
>>> 0x123
291
وكما في النظامين الثنائي والثماني، فإن القيم السادسة عشرية الحرفية هي أعداد صحيحة، ويمكنك إجراء كل عمليات الأعداد الصحيحة عليها.
وإضافة السابقة 0x إلى عدد ليس في النظام السادس عشر سترفع SyntaxError.
لتحويل قيمة int إلى تمثيل سادس عشري، يمكنك استخدام الدالة المدمجة [hex()][hex].
وهي تعمل بشكل مشابه للدالة bin()، إذ تُرجع سلسلة نصية:
>>> hex(291)
'0x123'
لتحويل تمثيل سادس عشري إلى عدد صحيح، يمكننا استخدام الدالة int()، بتمرير سلسلة نصية سادسة عشرية مع الأساس (16) كوسائط:
>>> int("0x123", 16)
291
وكما في النظامين الثنائي والثماني، فإن إعطاء أساس خاطئ سيرفع ValueError.