Η Python μπορεί να χειριστεί αριθμούς και συμβολοσειρές ως δυαδικούς, οκταδικούς και δεκαεξαδικούς αριθμούς καθώς και τους συνήθεις δεκαδικούς αριθμούς. Είναι επίσης εύκολη η μετατροπή μεταξύ τους.
Σε αυτή την ενότητα, θα εξηγηθούν τα ακόλουθα περιεχόμενα μαζί με παράδειγμα κώδικα.
- Γράψτε ακέραιους αριθμούς σε δυαδικό, οκταδικό και δεκαεξαδικό σύστημα.
- Μετατροπή αριθμών σε συμβολοσειρές σε δυαδική, οκταδική και δεκαεξαδική γραφή.
- ενσωματωμένη συνάρτηση (π.χ. σε γλώσσα προγραμματισμού)
bin()
,oct()
,hex()
- μέθοδος string
str.format()
, Ενσωματωμένες λειτουργίεςformat()
, f string - Μετατροπή ενός αρνητικού ακέραιου αριθμού σε συμβολοσειρά σε μορφή συμπληρώματος δύο.
- ενσωματωμένη συνάρτηση (π.χ. σε γλώσσα προγραμματισμού)
- Μετατροπή συμβολοσειρών σε δυαδική, οκταδική και δεκαεξαδική γραφή σε αριθμούς.
- ενσωματωμένη συνάρτηση (π.χ. σε γλώσσα προγραμματισμού)
int()
- ενσωματωμένη συνάρτηση (π.χ. σε γλώσσα προγραμματισμού)
- Παραδείγματα εφαρμογών
- Αριθμητική δυαδικών συμβολοσειρών
- Μετατροπή μεταξύ δυαδικών, οκταδικών και δεκαεξαδικών αριθμών
Γράψτε ακέραιους αριθμούς σε δυαδικό, οκταδικό και δεκαεξαδικό σύστημα.
Με την προσθήκη των ακόλουθων προθεμάτων, οι ακέραιοι αριθμοί 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()
- μέθοδος string
str.format()
, Ενσωματωμένες λειτουργίεςformat()
, f string
Αυτή η ενότητα εξηγεί επίσης πώς να λάβετε μια συμβολοσειρά εκφρασμένη σε μορφή συμπληρώματος δύο για αρνητικές τιμές.
Ενσωματωμένες συναρτήσεις 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'>
Ενσωματωμένη συνάρτηση format(), μέθοδος string 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
Η μέθοδος string 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& κατά bitwise με τον μέγιστο αριθμό ψηφίων bit που απαιτούνται, ως εξής.
- 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 με βάση το radix. Εάν το radix παραλειφθεί, ο αριθμός θεωρείται δεκαδικός.
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'>
Εάν το radix έχει οριστεί σε 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), να εκτελέσετε πράξεις σε αυτό και στη συνέχεια να το μετατρέψετε ξανά σε συμβολοσειρά 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