دودویی، هشتهشتی و شانزدهشانزدهی (که با نام هگز هم شناخته میشود) دستگاههای اعداد متفاوتی با مبناهای متفاوت هستند. دودویی مبنای ۲ است، هشتهشتی مبنای ۸ و شانزدهشانزدهی مبنای ۱۶. اعداد صحیح معمولی در Python مبنای ۱۰ دارند. دودویی، هشتهشتی و شانزدهشانزدهی همگی نمایشهایی از اعداد صحیح هستند. یعنی اعداد مثبت و منفی (از جمله صفر) را بدون کسر و اعشار نمایش میدهند و از همهی عملیاتهایی که میتوان با اعداد صحیح انجام داد پشتیبانی میکنند.
دودویی یک دستگاه اعداد با مبنای ۲ است که فقط از رقمهای ۰ و ۱ استفاده میکند. معمولاً حالتهای ۰ («خاموش») و ۱ («روشن») جریان برق را در ترانزیستورها و کلیدهای کامپیوتر نشان میدهد و همچنین بارهای مثبت و منفی را در حافظههای مغناطیسی. دودویی میتواند همهی اعداد صحیحی را که در مبنای ۱۰ به کار میروند نمایش دهد.
یک بخش از دستگاه مبنای ۲ اینگونه است، هرچند بینهایت ادامه دارد و به ۱۲۸ ختم نمیشود:
| ۱۲۸ | ۶۴ | ۳۲ | ۱۶ | ۸ | ۴ | ۲ | ۱ |
|---|---|---|---|---|---|---|---|
| ۲ ** ۷ | ۲ ** ۶ | ۲ ** ۵ | ۲ ** ۴ | ۲ ** ۳ | ۲ ** ۲ | ۲ ** ۱ | ۲ ** ۰ |
پس اگر بخواهیم عدد ۶ را در دودویی نمایش دهیم، ۱۱۰ میشود.
| ارزش مکانی | ۴ | ۲ | ۱ |
|---|---|---|---|
| عدد دودویی | ۱ | ۱ | ۰ |
و عملیات اینگونه خواهد بود: 4 + 2 + 0 = 6
مثال دیگر: ۱۹
| ارزش مکانی | ۱۶ | ۸ | ۴ | ۲ | ۱ |
|---|---|---|---|---|---|
| عدد دودویی | ۱ | ۰ | ۰ | ۱ | ۱ |
عدد دودویی ۱۰۰۱۱ خواهد بود.
و عملیات اینگونه خواهد بود: 16 + 0 + 0 + 2 + 1 = 19
در Python میتوانیم لیترالهای دودویی را با پیشوند 0b بنویسیم.
اگر 0b10011 را بنویسیم، Python آن را به عنوان یک عدد دودویی تفسیر میکند و به مبنای ۱۰ تبدیل میکند.
>>> 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 عدد ۴ را برمیگرداند:
>>> 0b11011.bit_count()
4
اگر بهصورت محلی کار میکنید، bit_count() حداقل به Python ۳.۱۰ نیاز دارد.
ویرایشگر آنلاین Exercism در حال حاضر از همهی قابلیتها تا Python ۳.۱۱ پشتیبانی میکند.
هشتهشتی یک دستگاه اعداد با مبنای ۸ است. از رقمهای ۰، ۱، ۲، ۳، ۴، ۵، ۶ و ۷ استفاده میکند.
در Python میتوانیم اعداد هشتهشتی را با پیشوند 0o نمایش دهیم.
مانند دودویی، Python بهطور خودکار یک نمایش هشتهشتی را به int تبدیل میکند.
>>> 0o123
83
مانند دودویی، اعداد هشتهشتی عدد صحیح هستند و از همهی عملیات صحیح پشتیبانی میکنند.
اگر عددی را با 0o شروع کنید که در دستگاه هشتهشتی نباشد، یک SyntaxError ایجاد میشود.
برای تبدیل یک int به نمایش هشتهشتی، میتوانید از تابع توکار [oct()][oct] استفاده کنید.
این تابع مانند bin() عمل میکند و یک رشته برمیگرداند:
>>> oct(83)
'0o123'
برای تبدیل یک عدد هشتهشتی به عدد صحیح، میتوانیم از تابع int() استفاده کنیم و یک رشتهی نمایش هشتهشتی و مبنا (۸) را به عنوان آرگومان به آن بدهیم:
>>> int("0o123", 8)
83
مانند دودویی، دادن مبنای اشتباه یک ValueError ایجاد میکند.
شانزدهشانزدهی یک دستگاه اعداد با مبنای ۱۶ است. از رقمهای ۰ تا ۹ و حروف A، B، C، D، E و F استفاده میکند. A برابر ۱۰، B برابر ۱۱، C برابر ۱۲، D برابر ۱۳، E برابر ۱۴ و F برابر ۱۵ است.
میتوانیم اعداد شانزدهشانزدهی را در Python با پیشوند 0x نمایش دهیم.
مانند دودویی و هشتهشتی، Python لیترالهای شانزدهشانزدهی را بهطور خودکار به int تبدیل میکند.
>>> 0x123
291
مانند دودویی و هشتهشتی، لیترالهای شانزدهشانزدهی هم عدد صحیح هستند و میتوانید همهی عملیات صحیح را با آنها انجام دهید.
شروع کردن یک عدد غیرشانزدهشانزدهی با 0x یک SyntaxError ایجاد میکند.
برای تبدیل یک int به نمایش شانزدهشانزدهی، میتوانید از تابع توکار [hex()][hex] استفاده کنید.
این تابع مانند bin() عمل میکند و یک رشته برمیگرداند:
>>> hex(291)
'0x123'
برای تبدیل یک نمایش شانزدهشانزدهی به عدد صحیح، میتوانیم از تابع int() استفاده کنیم و یک رشتهی شانزدهشانزدهی را همراه با مبنا (۱۶) به عنوان آرگومان به آن بدهیم:
>>> int("0x123", 16)
291
مانند دودویی و هشتهشتی، دادن مبنای اشتباه یک ValueError ایجاد میکند.