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
- bin() — Built-in Functions — Python 3.10.0 Documentation
- oct() — Built-in Functions — Python 3.10.0 Documentation
- hex() — Built-in Functions — Python 3.10.0 Documentation
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