Αρχές Προγραμματισμού Συστήματα αρίθμησης

Μετατροπή δεκαδικών σε άλλα αριθμητικά συστήματα.

Μέχρι τώρα είδαμε πως να μετατρέπουμε δυαδικούς αριθμούς σε δεκαδικούς και δεκαεξαδικούς σε δεκαδικούς. Ας μελετήσουμε πως μπορούμε να μετατρέψουμε δεκαδικούς σε δυαδικούς. 'Όπως θα παρατηρήσατε στον παραπάνω πίνακα, 4 bit αρκούν για να περιγράψουν όλους τους ακέραιους από το 0 εως και το 15 που είναι στο σύνολο 16 αριθμοί. Αυτό συμβαίνει γιατί 24 = 16. Όπως είναι αναμενόμενο 8 bit θα περιγράφουν όλους τους αριθμούς από το 0 εώς και το 255, 16 bit εώς και το 65535 και ούτο καθ' εξής. Ίσως είναι χρησιμό να έχουμε έναν πίνακα τουλάχιστον στην αρχή με μερικές από τις δυνάμεις του 2.

20 21 22 23 24 25 26 27 28 29 210
1 2 4 8 16 32 64 128 256 512 1024

Έστω ότι θέλουμε να μετατρέψουμε το δεκαδικό 346 στην δυαδική του αναπαράσταση:

1ος τρόπος (πρακτικός): Βρίσκουμε την μεγαλύτερη δύναμη του 2 που "χωράει" στο 346. Αυτό είναι το 256 που είναι η δύναμη του 8. O εκθέτης 8 ανήκει στη θέση 9 άρα αρκούν 9 bit. Η 9η αυτή θέση θα έχει και την τιμή 1. Ο αριθμός μας, μέχρι τώρα, είναι κάπως έτσι:
1x x x x x x x x
Αφαιρούμε το 256 από το 346 και βρίσκουμε ότι 346 - 256 = 90. Συνεχίζουμε όπως και πριν αλλά με το 90. Το 128 είναι μεγαλύτερο από το 90 άρα το επόμενο bit (το 8ο) δεν χρησιμοποιείται οπότε θα είναι μηδέν. Το 64 χωράει στο 90 άρα το 7ο bit θα είναι 1.
1 0 1 x x x x x x
90 - 64 = 26. To 32 δεν μας κάνει αλλά το 16 είναι μια χαρά. Βάζουμε μηδέν για το 32 (6ο bit) και 1 για το 16 (5ο bit).
1 0 1 0 1 x x x x
Με τον ίδιο βαρετό τρόπο συνεχίζουμε και βλέπουμε ότι 26 - 16 = 10 άρα το το 8 χωράει οπότε βάζουμε 1 στo 4o bit, 10 - 8 = 2, το 4 δεν μας κάνει (μηδέν στο 3ο bit) αλλά το 2 μας κάνει οπότε 1 στο 2ο bit και τέλος 2 - 2 = 0 οπότε 0 στο 1ο bit. Ο δυαδικός τελικά είναι ο 101011010.

Ουσιαστικά αυτό που κάναμε είναι να αναλύσουμε το 346 σε άθροισμα δυνάμεων του 2, δηλαδή:

346 = 1·28 + 0·27 + 1·26 + 0·25 + 1·24 + 1·23 + 0·22 + 1·21 + 0·20

'Όπως θα παρατηρήσατε οι συντελεστές των δυνάμεων είναι και ο δυαδικός μας αριθμός.

2ος τρόπος (Ευκλείδειος αλγόριθμος): Τώρα θα κάνουμε διαδοχικές διαιρέσεις με το 2 και κρατάμε το υπόλοιπο. Θα σταματήσουμε όταν το πηλίκο γίνει μηδέν. Αν το το υπόλοιπο είναι μηδέν τότε μηδέν θα είναι και ο συντελεστής. Αν το υπόλοιπο είναι 1, αυτός θα είναι και ο συντελεστής. Η διαφορά είναι ότι τώρα ο αριθμός γράφεται από δεξιά προς τα αριστερά και όχι το ανάποδο όπως κάναμε πριν. Έχουμε λοιπόν:

346/2 = 173 με υπόλοιπο 0 (1ο bit)
173/2 = 86 με υπόλοιπο 1 (2ο bit)
86/2 = 43 με υπόλοιπο 0 (3ο bit)
43/2 = 21 με υπόλοιπο 1 (4ο bit)
21/2 = 10 με υπόλοιπο 1 (5ο bit)
10/2 = 5 με υπόλοιπο 0 (6ο bit)
5/2 = 2 με υπόλοιπο 1 (7ο bit)
2/2 = 1 με υπόλοιπο 0 (8ο bit)
1/2 = 0 με υπόλοιπο 1 (9ο bit)
x x x x x x x x 0
x x x x x x x 10
x x x x x x 010
x x x x x 1010
x x x x 11010
x x x 011010
x x 1011010
x 01011010
101011010

Όπως ήταν αναμενόμενο ο δυαδικός είναι ο 101011010.

Για να μετατρέψουμε δεκαδικούς σε δεκαεξαδικούς μπορούμε να χρησιμοποιήσουμε τον 2ο τρόπο και να κάνουμε διαδοχικές διαιρέσεις με το 16. Αυτή τη φορά τα υπόλοιπα θα είναι αριθμοί από το 0 εώς και το 15. Αυτοί θα είναι και οι συντελεστές του δεκαεξαδικού μας αριθμού.

346/16 = 21 με υπόλοιπο 10=A
21/16 = 1 με υπόλοιπο 5
1/16 = 0 με υπόλοιπο 1

Το 346 σε δεκαεξαδική μορφή γράφεται σαν 0x15A.

Ερώτηση: Τι κοινό έχουν όλοι οι περιττοί αριθμοί μεταξύ τους, στο δυαδικό σύστημα;

Ερώτηση: Πως θα μετατρέψουμε γρήγορα έναν δεκαεξαδικό σε δυαδικό;

Ασκηση: Μπορείτε να μετατρέψετε όποιον αριθμό θέλετε από δεκαδικό σε δυαδικό και δεκαεξαδικό και αντίστροφα.