Διαδρομές
/
Python
Python
/
Ύλη
/
Δυαδικό, οκταδικό και δεκαεξαδικό
Δυ

Δυαδικό, οκταδικό και δεκαεξαδικό σε Python

{one: "1 άσκηση", other: "%{count} ασκήσεις"}

Σχετικά με την έννοια Δυαδικό, οκταδικό και δεκαεξαδικό

Το δυαδικό, το οκταδικό και το δεκαεξαδικό (γνωστό και ως hex) είναι διαφορετικά συστήματα αρίθμησης με διαφορετικές βάσεις. Το δυαδικό είναι βάσης 2, το οκταδικό είναι βάσης 8 και το δεκαεξαδικό είναι βάσης 16. Οι συνηθισμένοι ακέραιοι στην Python είναι βάσης 10. Το δυαδικό, το οκταδικό και το δεκαεξαδικό είναι όλα αναπαραστάσεις ακεραίων. Αυτό σημαίνει ότι αναπαριστούν θετικούς και αρνητικούς αριθμούς (συμπεριλαμβανομένου του μηδενός) χωρίς κλάσματα ή δεκαδικά ψηφία, και υποστηρίζουν όλες τις πράξεις που μπορούμε να κάνουμε με ακεραίους.

Δυαδικό

Το δυαδικό είναι ένα σύστημα αρίθμησης βάσης 2, που χρησιμοποιεί μόνο τα ψηφία 0 και 1. Συνήθως αναπαριστά τις καταστάσεις 0 ("off") και 1 ("on") της ηλεκτρικής ροής μέσα από τρανζίστορ και διακόπτες στους υπολογιστές, καθώς και τα θετικά και αρνητικά φορτία στα μαγνητικά μέσα αποθήκευσης. Το δυαδικό μπορεί να αναπαραστήσει όλους τους ακεραίους που χρησιμοποιούνται στη βάση 10.

Ένα απόσπασμα από το σύστημα βάσης 2 μοιάζει κάπως έτσι, αν και συνεχίζεται άπειρα και δεν σταματά στο 128:

128 64 32 16 8 4 2 1
2 ** 7 2 ** 6 2 ** 5 2 ** 4 2 ** 3 2 ** 2 2 ** 1 2 ** 0

Έτσι, αν θέλουμε να αναπαραστήσουμε τον αριθμό 6 στο δυαδικό, θα ήταν 110.

Τιμή θέσης 4 2 1
Δυαδικός αριθμός 1 1 0

Και η πράξη θα ήταν: 4 + 2 + 0 = 6

Άλλο ένα παράδειγμα: 19

Τιμή θέσης 16 8 4 2 1
Δυαδικός αριθμός 1 0 0 1 1

Ο δυαδικός αριθμός θα ήταν: 10011 Και η πράξη θα ήταν: 16 + 0 + 0 + 2 + 1 = 19

Το δυαδικό στην Python

Στην Python, μπορούμε να αναπαραστήσουμε δυαδικά literals χρησιμοποιώντας το πρόθεμα 0b. Αν γράψουμε 0b10011, η Python θα το ερμηνεύσει ως δυαδικό αριθμό και θα το μετατρέψει σε βάση 10.

>>> 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 θα μετατρέψει αυτόματα ένα δυαδικό literal σε int. Για να μετατρέψεις ένα int σε δυαδική αναπαράσταση, χρησιμοποίησε την ενσωματωμένη συνάρτηση [bin()][bin]. Η bin() θα επιστρέψει μια str με το δυαδικό ισοδύναμο και το πρόθεμα 0b .

>>> bin(19)
'0b10011'

Για να μετατρέψεις ένα δυαδικό literal σε ακέραιο, μπορούμε να χρησιμοποιήσουμε την ενσωματωμένη συνάρτηση 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() θα επιστρέψει τον αριθμό των bit που χρειάζονται για να αναπαρασταθεί ο αριθμός:

>>> 0b11011.bit_length()
5

Η <int>.bit_count() θα επιστρέψει τον αριθμό των άσσων στον δυαδικό αριθμό. Για παράδειγμα, η bit_count() στο '0b11011' θα επιστρέψει 4:

>>> 0b11011.bit_count()
4
Note

Αν δουλεύεις τοπικά, η bit_count() απαιτεί τουλάχιστον Python 3.10. Ο διαδικτυακός editor του Exercism υποστηρίζει αυτή τη στιγμή όλες τις λειτουργίες μέχρι την Python 3.11.

Οκταδικό

Το οκταδικό είναι ένα σύστημα αρίθμησης βάσης 8. Χρησιμοποιεί τα ψηφία 0, 1, 2, 3, 4, 5, 6 και 7.

Στην Python, μπορούμε να αναπαραστήσουμε οκταδικούς αριθμούς χρησιμοποιώντας το πρόθεμα 0o. Όπως και με το δυαδικό, η Python μετατρέπει αυτόματα μια οκταδική αναπαράσταση σε int.

>>> 0o123
83

Όπως και με το δυαδικό, οι οκταδικοί αριθμοί είναι int και υποστηρίζουν όλες τις πράξεις ακεραίων. Αν βάλεις πρόθεμα 0o σε έναν αριθμό που δεν ανήκει στο οκταδικό σύστημα, θα πετάξει ένα SyntaxError.

Μετατροπή από και προς την οκταδική αναπαράσταση

Για να μετατρέψεις ένα int σε οκταδική αναπαράσταση, μπορείς να χρησιμοποιήσεις την ενσωματωμένη συνάρτηση [oct()][oct]. Αυτή λειτουργεί παρόμοια με τη συνάρτηση bin(), επιστρέφοντας μια συμβολοσειρά:

>>> oct(83)
'0o123'

Για να μετατρέψεις έναν οκταδικό αριθμό σε ακέραιο, μπορούμε να χρησιμοποιήσουμε τη συνάρτηση int(), περνώντας ως ορίσματα μια συμβολοσειρά με την οκταδική αναπαράσταση και τη βάση (8):

>>> int("0o123", 8)
83

Όπως και με το δυαδικό, το να δώσεις λάθος βάση θα πετάξει ένα ValueError.

Δεκαεξαδικό

Το δεκαεξαδικό είναι ένα σύστημα αρίθμησης βάσης 16. Χρησιμοποιεί τα ψηφία 0 - 9 και τα γράμματα A, B, C, D, E και F. Το A είναι 10, το B είναι 11, το C είναι 12, το D είναι 13, το E είναι 14 και το F είναι 15.

Μπορούμε να αναπαραστήσουμε δεκαεξαδικούς αριθμούς στην Python χρησιμοποιώντας το πρόθεμα 0x. Όπως και με το δυαδικό και το οκταδικό, η Python θα μετατρέψει αυτόματα τα δεκαεξαδικά literals σε int.

>>> 0x123
291

Όπως και με το δυαδικό και το οκταδικό, τα δεκαεξαδικά literals είναι int και μπορείς να εκτελέσεις όλες τις πράξεις ακεραίων με αυτά. Αν βάλεις πρόθεμα 0x σε έναν μη δεκαεξαδικό αριθμό, θα πετάξει ένα SyntaxError.

Μετατροπή από και προς τη δεκαεξαδική αναπαράσταση

Για να μετατρέψεις ένα int σε δεκαεξαδική αναπαράσταση, μπορείς να χρησιμοποιήσεις την ενσωματωμένη συνάρτηση [hex()][hex]. Αυτή λειτουργεί παρόμοια με τη συνάρτηση bin(), επιστρέφοντας μια συμβολοσειρά:

>>> hex(291)
'0x123'

Για να μετατρέψεις μια δεκαεξαδική αναπαράσταση σε ακέραιο, μπορούμε να χρησιμοποιήσουμε τη συνάρτηση int(), περνώντας ως ορίσματα μια δεκαεξαδική συμβολοσειρά και τη βάση (16):

>>> int("0x123", 16)
291

Όπως και με το δυαδικό και το οκταδικό, το να δώσεις λάθος βάση θα πετάξει ένα ValueError.

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα