แปลงเลขฐานสอง ฐานแปด และฐานสิบหกและสตริงเป็นและจากกันใน Python

ธุรกิจ

Python สามารถจัดการตัวเลขและสตริงเป็นเลขฐานสอง ฐานแปด และฐานสิบหก เช่นเดียวกับตัวเลขทศนิยมปกติ นอกจากนี้ยังง่ายต่อการแปลงระหว่างพวกเขา

ในส่วนนี้ จะอธิบายเนื้อหาต่อไปนี้พร้อมกับโค้ดตัวอย่าง

  • เขียนจำนวนเต็มเป็นเลขฐานสอง ฐานแปด และเลขฐานสิบหก
  • แปลงตัวเลขเป็นสตริงในรูปแบบไบนารี ฐานแปด และฐานสิบหก
    • ฟังก์ชันในตัว (เช่น ในภาษาโปรแกรม)bin(),oct(),hex()
    • วิธีสตริงstr.format(), ฟังก์ชั่นในตัวformat(), เอฟสตริง
    • แปลงจำนวนเต็มลบเป็นสตริงในรูปแบบเสริมของสอง
  • แปลงสตริงในรูปแบบไบนารี ฐานแปด และฐานสิบหกเป็นตัวเลข
    • ฟังก์ชันในตัว (เช่น ในภาษาโปรแกรม)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

แม้ว่าจะมีคำนำหน้า แต่ประเภทก็ยังเป็นจำนวนเต็ม

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(), เอฟสตริง

ส่วนนี้ยังอธิบายวิธีรับสตริงที่แสดงในรูปแบบเสริมของสองค่าสำหรับค่าลบ

ฟังก์ชันในตัว 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 string

ฟังก์ชัน format() ในตัวและเมธอดสตริง 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

เริ่มต้นด้วย Python 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

ใน Python การดำเนินการระดับบิตกับจำนวนเต็มลบจะถูกดำเนินการในการแทนค่าของสองส่วนเสริม ดังนั้น หากคุณต้องการรับสตริงที่แสดงในรูปแบบเสริมของสอง คุณสามารถใช้ตรรกะเชิงตรรกะระดับบิต OR& โดยมีจำนวนบิตสูงสุดที่ต้องการดังนี้

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

แปลงสตริงในรูปแบบไบนารี ฐานแปด และฐานสิบหกเป็นตัวเลข

ฟังก์ชันในตัว int()

ในการแปลงสตริงในรูปแบบไบนารี ฐานแปด หรือฐานสิบหกเป็นตัวเลข ให้ใช้ฟังก์ชันในตัว int()

ด้วย int(string, radix) สตริง str ในรูปแบบไบนารี ฐานแปด เลขฐานสิบหก ฯลฯ สามารถแปลงเป็น 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 ที่จุดเริ่มต้น (ด้านซ้าย) ด้วย 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) ดำเนินการกับค่านั้น จากนั้นแปลงกลับเป็นสตริง str อีกครั้ง

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