تبدیل اعداد و رشته های باینری، اکتال و هگزادسیمال به یکدیگر در پایتون

کسب و کار

پایتون می‌تواند اعداد و رشته‌ها را به‌عنوان اعداد باینری، هشت‌گانه و هگزا دسیمال و همچنین اعداد اعشاری معمول مدیریت کند. تبدیل بین آنها نیز آسان است.

در این قسمت مطالب زیر به همراه کد نمونه توضیح داده می شود.

  • اعداد صحیح را به صورت باینری، اکتال و هگزادسیمال بنویسید.
  • اعداد را به رشته های باینری، اکتال و هگزادسیمال تبدیل کنید.
    • تابع داخلی (به عنوان مثال در زبان برنامه نویسی)bin()،oct()،hex()
    • روش رشتهstr.format(), توابع داخلیformat()، رشته f
    • یک عدد صحیح منفی را به یک رشته در قالب مکمل دو تبدیل کنید.
  • رشته ها را در نمادهای باینری، اکتال و هگزادسیمال به اعداد تبدیل کنید.
    • تابع داخلی (به عنوان مثال در زبان برنامه نویسی)int()
  • نمونه های کاربردی
    • ریاضی رشته دودویی
    • تبدیل بین اعداد باینری، اکتال و هگزادسیمال

اعداد صحیح را به صورت باینری، اکتال و هگزادسیمال بنویسید.

با اضافه کردن پیشوندهای زیر می توان اعداد صحیح را به ترتیب باینری، اکتال و هگزادسیمال نوشت.
می توانید از حروف بزرگ نیز استفاده کنید.

  • عدد باینری:0bیا0B
  • اکتال:0oیا0O
  • عدد هگزادسیمال:0xیا0X

خروجی print() به صورت اعشاری خواهد بود.

bin_num = 0b10
oct_num = 0o10
hex_num = 0x10

print(bin_num)
print(oct_num)
print(hex_num)
# 2
# 8
# 16

Bin_num = 0B10
Oct_num = 0O10
Hex_num = 0X10

print(Bin_num)
print(Oct_num)
print(Hex_num)
# 2
# 8
# 16

حتی با پیشوند، نوع یک عدد صحیح int است.

print(type(bin_num))
print(type(oct_num))
print(type(hex_num))
# <class 'int'>
# <class 'int'>
# <class 'int'>

print(type(Bin_num))
print(type(Oct_num))
print(type(Hex_num))
# <class 'int'>
# <class 'int'>
# <class 'int'>

از آنجایی که یک نوع عدد صحیح است، می توان از آن برای عملیات حسابی منظم استفاده کرد.

result = 0b10 * 0o10 + 0x10
print(result)
# 32

با شروع با Python 3.6، امکان درج زیرخط _ در اعداد وجود دارد. تکرار زیرخط _ منجر به خطا می شود، اما تا زمانی که آن را تکرار نکنید، می توانید هر تعداد که دوست دارید وارد کنید.

خط زیر روی عدد تاثیر نمی گذارد، بنابراین می توان از آن به عنوان جداکننده زمانی که ارقام زیادی وجود دارد استفاده کرد. به عنوان مثال، درج زیرخط _ هر چهار رقم به راحتی قابل خواندن است.

print(0b111111111111 == 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True

bin_num = 0b1111_1111_1111
print(bin_num)
# 4095

اعداد را به رشته های باینری، اکتال و هگزادسیمال تبدیل کنید.

برای تبدیل یک عدد به رشته در نمادهای باینری، اکتال یا هگزادسیمال، از توابع داخلی زیر استفاده کنید.

  • تابع داخلی (به عنوان مثال در زبان برنامه نویسی)bin()،oct()،hex()
  • روش رشتهstr.format(), توابع داخلیformat()، رشته f

این بخش همچنین توضیح می دهد که چگونه می توان یک رشته را با فرمت مکمل دو برای مقادیر منفی بیان کرد.

توابع داخلی bin()، oct()، hex()

توابع داخلی زیر می توانند اعداد را به رشته های باینری، اکتال و هگزادسیمال تبدیل کنند.

  • عدد باینری:bin()
  • اکتال:oct()
  • عدد هگزادسیمال:hex()

هر کدام یک رشته با پیشوندهای زیر برمی گرداند

  • عدد باینری:0b
  • اکتال:0o
  • عدد هگزادسیمال:0x
i = 255

print(bin(i))
print(oct(i))
print(hex(i))
# 0b11111111
# 0o377
# 0xff

print(type(bin(i)))
print(type(oct(i)))
print(type(hex(i)))
# <class 'str'>
# <class 'str'>
# <class 'str'>

اگر به پیشوند نیاز ندارید، از slice[2:] برای استخراج رشته پشت آن استفاده کنید، یا همانطور که در ادامه توضیح داده شد از format() استفاده کنید.

print(bin(i)[2:])
print(oct(i)[2:])
print(hex(i)[2:])
# 11111111
# 377
# ff

اگر می خواهید آن را به یک رشته اعشاری تبدیل کنید، می توانید از str() استفاده کنید.

print(str(i))
# 255

print(type(str(i)))
# <class 'str'>

فرمت تابع داخلی()، روش رشته ای str.format()، رشته f

فرمت تابع داخلی () و متدهای رشته‌ای str.format() و f-string همچنین می‌توانند اعداد را به رشته‌های باینری، هشت‌گانه و هگزادسیمال تبدیل کنند.

با تعیین آرگومان دوم format() به صورت زیر می توان آن را به ترتیب به رشته های باینری، اکتال و هگزادسیمال تبدیل کرد.

  • عدد باینری:b
  • اکتال:o
  • عدد هگزادسیمال:x
print(format(i, 'b'))
print(format(i, 'o'))
print(format(i, 'x'))
# 11111111
# 377
# ff

print(type(format(i, 'b')))
print(type(format(i, 'o')))
print(type(format(i, 'x')))
# <class 'str'>
# <class 'str'>
# <class 'str'>

اگر می خواهید رشته ای با پیشوند 0b,0o,0x دریافت کنید، # را به رشته مشخصات قالب بندی اضافه کنید.

print(format(i, '#b'))
print(format(i, '#o'))
print(format(i, '#x'))
# 0b11111111
# 0o377
# 0xff

همچنین می توان 0 را با هر تعداد رقم پر کرد. توجه داشته باشید که تعداد کاراکترهای پیشوند (دو کاراکتر) نیز هنگام پر کردن صفر با پیشوند باید در نظر گرفته شود.

print(format(i, '08b'))
print(format(i, '08o'))
print(format(i, '08x'))
# 11111111
# 00000377
# 000000ff

print(format(i, '#010b'))
print(format(i, '#010o'))
print(format(i, '#010x'))
# 0b11111111
# 0o00000377
# 0x000000ff

روش رشته str.format() نیز می تواند برای تبدیل استفاده شود.

print('{:08b}'.format(i))
print('{:08o}'.format(i))
print('{:08x}'.format(i))
# 11111111
# 00000377
# 000000ff

با شروع با پایتون 3.6، می توانید از رشته f نیز استفاده کنید.f'xxx'

print(f'{i:08b}')
print(f'{i:08o}')
print(f'{i:08x}')
# 11111111
# 00000377
# 000000ff

یک عدد صحیح منفی را به یک رشته در قالب مکمل دو تبدیل کنید.

هنگامی که یک عدد صحیح منفی با استفاده از bin() یا format() به یک رشته باینری یا هگزادسیمال تبدیل می شود، مقدار مطلق علامت منفی خواهد داشت.

x = -9

print(x)
print(bin(x))
# -9
# -0b1001

در پایتون، عملیات بیتی روی اعداد صحیح منفی نیز در نمایش مکمل دو انجام می شود. بنابراین، اگر می‌خواهید رشته‌ای را دریافت کنید که به صورت مکمل دو بیان می‌شود، می‌توانید یک OR منطقی بیتی و & با حداکثر تعداد ارقام بیت مورد نیاز، به شرح زیر.

  • 4bit:0b1111(=0xf)
  • 8bit:0xff
  • 16bit:0xffff
print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7

رشته ها را در نمادهای باینری، اکتال و هگزادسیمال به اعداد تبدیل کنید.

تابع داخلی int()

برای تبدیل یک رشته در نمادهای باینری، اکتال یا هگزادسیمال به عدد، از تابع داخلی () int استفاده کنید.

با int(string, radix)، یک رشته رشته در نمادهای باینری، اکتال، هگزادسیمال و غیره را می توان به int عددی بر اساس ریشه تبدیل کرد. اگر ریشه حذف شود، عدد اعشاری در نظر گرفته می شود.

print(int('10'))
print(int('10', 2))
print(int('10', 8))
print(int('10', 16))
# 10
# 2
# 8
# 16

print(type(int('10')))
print(type(int('10', 2)))
print(type(int('10', 8)))
print(type(int('10', 16)))
# <class 'int'>
# <class 'int'>
# <class 'int'>
# <class 'int'>

اگر رادیکس روی 0 تنظیم شود، تبدیل بر اساس پیشوند رشته زیر انجام می شود.

  • پیشوند باینری:0bیا0B
  • پیشوند هشتی:0oیا0O
  • پیشوند هگزادسیمال:0xیا0X
print(int('0b10', 0))
print(int('0o10', 0))
print(int('0x10', 0))
# 2
# 8
# 16

print(int('0B10', 0))
print(int('0O10', 0))
print(int('0X10', 0))
# 2
# 8
# 16

اگر عدد پایه 0 باشد و هیچ پیشوندی وجود نداشته باشد، به عدد اعشاری تبدیل می شود، اما توجه داشته باشید که اگر ابتدا (سمت چپ) با 0 پر شود، خطایی رخ می دهد.

print(int('10', 0))
# 10

# print(int('010', 0))
# ValueError: invalid literal for int() with base 0: '010'

در موارد دیگر، رشته های صفر پر شده را می توان به همان صورت تبدیل کرد.

print(int('010'))
# 10

print(int('00ff', 16))
print(int('0x00ff', 0))
# 255
# 255

اگر رشته را نتوان با ریشه یا پیشوند مشخص شده تبدیل کرد، خطایی رخ می دهد.

# print(int('ff', 2))
# ValueError: invalid literal for int() with base 2: 'ff'

# print(int('0a10', 0))
# ValueError: invalid literal for int() with base 0: '0a10'

# print(int('0bff', 0))
# ValueError: invalid literal for int() with base 0: '0bff'

نمونه های کاربردی

ریاضی رشته دودویی

به عنوان مثال، برای انجام عملیات بر روی یک رشته به صورت باینری با پیشوند 0b.

شما به راحتی می توانید آن را به یک مقدار عددی (نوع عدد صحیح int) تبدیل کنید، عملیات را روی آن انجام دهید و سپس دوباره آن را به یک رشته رشته تبدیل کنید.

a = '0b1001'
b = '0b0011'

c = int(a, 0) + int(b, 0)

print(c)
print(bin(c))
# 12
# 0b1100

تبدیل بین اعداد باینری، اکتال و هگزادسیمال

همچنین تبدیل رشته های باینری، اکتال و هگزادسیمال به یکدیگر آسان است. پس از تبدیل به یک int عددی، می توان آن را به رشته ای با هر فرمتی تبدیل کرد.

صفر پر کردن، پیشوند و غیره را می توان با رشته مشخصات قالب بندی کنترل کرد.

a_0b = '0b1110001010011'

print(format(int(a, 0), '#010x'))
# 0x00000009

print(format(int(a, 0), '#010o'))
# 0o00000011
Copied title and URL