========================================================================================
ΜΙΑ ΜΙΚΡΗ ΠΑΡΕΝΘΕΣΗ - ΜΕΤΑΤΡΟΠΕΣ ΑΡΙΘΜΩΝΛοιπον μιας και μέσα στον οδηγό ασχολούμαστε με παραδείγματα και θέματα τα οποία αγγίζουν αρκετα δυαδικό αλλα και 16-δικο σύστημα
Οπότε κάνω εδω μια παρένθεση για να εξηγήσω λιγο τις μετατροπές για όσους δεν τις έχουν καταλαβει ωστε να μπορέσουν στην συνέχεια να παρακολουθήσουν και τους οδηγούς με μεγαλύτερη άνεση.
ΔΥΑΔΙΚΟ ΣΥΣΤΗΜΑ2 λόγια λοιπον για το γνωστο μας δυαδικό σύστημα. Στο δυαδικό σύστημα παίζουν 2 τιμές το 0 και το 1. Το σύστημα αυτο λοιπον έχει βάση R=2 (Radix) και ειναι ουσιαστικά το σύστημα στο οποίο καταλαβαίνουν
ΟΛΟΙ οι ηλεκτρονικοί υπολογιστές γενικότερα και οι επεξεργαστές ειδικότερα. Τα πάντα σε εναν υπολογιστή ειναι αποθηκευμένα στο δυαδικό σύστημα. Το δεκαεξαδικό , το οκταδικό και το δεκαδικό ειναι μονο αναπαραστάσεις των δυαδικών δεδομένων.
Ερώτηση -> Γιατι ομως επιλέγεται αυτο το σύστημα και όχι κάποιο άλλο?
Ο λόγος έγκειται στο γεγονός οτι μια CPU (Central Processing Unit) διαθέτει εκατομμύρια τρανζίστορ , τα τρανζίστορ αυτα χρησιμοποιούν ηλεκτρονικούς διακόπτες οι οποίοι έχουν 2 καταστάσεις την ενεργή και την μη ενεργή , σε αυτές τις 2 καταστάσεις λοιπον θέτουμε 2 τιμές το 0 και το 1.
Συνεπώς ο υπολογιστής καταλαβαίνει μονο εντολές οι οποίες αποτελούνται απο μια σειρά απο 0 και 1 δηλαδη ένας υπολογιστής μπορει να καταλάβει μονο δυαδικές ακολουθίες (ακολουθίες απο bits). Οι εντολές της γλώσσας μηχανής λοιπον θα πρέπει να ειναι σε δυαδική μορφή. Ακριβως για αυτο τον λόγο και ενα πρόγραμμα σε κάποια γλώσσα τελικα θα μετατραπεί (με μια διαδικασία κρυφή απο τον χρήστη) σε δυαδικό ισοδύναμο για να μπορέσει να το καταλάβει και ο υπολογιστής και τελικα να γίνει η δουλειά μας.
H μικρότερη μονάδα δυαδικού κωδικα τωρα ονομάζεται
bit η ονομασία προέρχεται απο το
binary digit το οποίο ειναι το δυαδικό ψηφίο ή δυφίο.
και οπως ανέφερα και πιο πανω μπορεί να πάρει 2 πιθανές τιμές => {0,1} . Τα bits τωρα οργανώνονται με τις 4-αδες απο bit να τις λεμε nibbles και τις 2 4-αδες στη σειρα δηλαδή 8 bit να λεμε πως σχηματίζουν 1 byte.
- Κώδικας: Επιλογή όλων
====+====+=====+====+====+====+=====+====+============================
b7 b6 b5 b4 b3 b2 b1 b0
====+====+=====+====+====+====+=====+====+============================
αυτο λοιπον είναι ενα byte το οποίο αποτελείται απο 8 bit οπως είπαμε και πιο πανω. Εδώ λοιπον το bit7(b7) είναι το περισσότερο σημαντικό bit ενω το bit0 (b0) το λιγότερο σημαντικό.
Γενικά και αυτο είναι αρκετα σημαντικό κάθε ακολουθία απο bits ξεκινάει απο την θέση 0 (θέση με το λιγότερο σημαντικό ψηφίο) και τερματίζει στην θέση n-1. Αν για παράδειγμα εγω έχω φερειπείν την ακολουθία 11100 τοτε αυτή η ακολουθία αποτελείται απο n=5 bits η ακολουθία αυτη αποτελείται απο το b0=0 , b1=0 , b2=1 , b3=1 και τέλος το b4=1 δηλαδη τα περιεχόμενα αυτης της ακολουθίας τα οποία ειναι τα ίδια τα bits της ξεκινησαν απο την θέση 0 έως την θέση n-1 η θέση 4 στο συγκεκριμένο μας παράδειγμα. Κατανοητό?
Πάμε τωρα σιγα-σιγα να κάνουμε την πρώτη μας μετατροπή :
- Κώδικας: Επιλογή όλων
Δίνεται η ακολουθία Α=11100000 να μετατραπεί σε δεκαδικό σύστημα.
Σε αυτο το σημείο υπάρχουν 2 πράγματα. Υπάρχουν τα bits και οι θέσεις τους. Επειδή ομως βρίσκομαι στο δυαδικό σύστημα ακομη εγω (οπως μπορείτε να διακρίνετε δεν έχουμε πάει ακομη στο δεκαδικό

) θα βάλω στο "παιχνίδι" και ενα τρίτο πράγμα την βάση 2. ΕΠομένως αυτη τη στιγμή εχω 3 πράγματα. Τα bits , τις θέσεις τους και την βάση 2 οκ?
Μια σκέψη ειναι να συνδυάσω τα παραπάνω 3 πράγματα ωστε να κάνω τελικά την μετατροπή απο το δυαδικό στο δεκαδικό σύστημα. Πάμε!
Βήμα 1o => Κάθε bit της παραπάνω ακολουθίας Α θα πολλαπλασιάζεται κάθε φορά με την βάση 2 υψωμένη σε δύναμη που είναι ιση με την θέση του bit μέσα στην ακολουθία.
Βημα 2ο => Τα σουμάρω όλα μαζι (τα προσθέτω δηλαδη) και βρίσκω το τελικό αποτέλεσμα.
Καταρχήν οι θέσεις αυτης της ακολουθίας θα ξεκινούν απο 0..... n-1 <=> 0.....7
Πάμε να επομένως να δούμε τα παραπάνω 3 βήματα πως γίνονται
- Κώδικας: Επιλογή όλων
1*2^7+1*2^6+1*2^5+0*2^4+0*2^3+0*2^2+0*2^1+0*2^0 = 128+64+32+0+0+0+0+0=224
Στην θέση 0 αν κοιτάξουμε απο δεξιά προς τα αριστερά εχω το bit 0 (b0=0) αρα θα πολλαπλασιαστεί με 2^θέση του => 0 * 2^0
ΣΤην θέση 1 αν κοιτάξω απο δεξιά προς τα αριστερά εχω το bit 1 (b1=0) αρα θα πολλαπλασιαστεί με 2^θέση του => 0 *2^1
κ.ο.κ και ομοίως και για τα υπόλοιπα.
Πάμε τωρα να κάνουμε το αντίστροφο , δηλαδη μετατροπή 224 απο δεκαδικό σε δυαδικό

οχι εντάξει εύκολο ειναι

Εδώ απλά διαιρούμε το 224 με το 2 πάλι (θυμηθείτε πως ειναι η βάση μας -για εδώ-) και μετά απο αυτή την διαίρεση παίρνουμε το πηλίκο ενω κρατάμε το υπόλοιπο (γιατι θα το χρησιμοποιήσουμε στο τέλος ειναι ουσιαστικά στοιχείο της δυαδικής μας τελικής ακολουθίας το κάθε υπόλοιπο) και ξαναδιαιρούμε με το 2 κτλπ... επειδή ομως με τα γραφόμενα δεν ειναι πλήρως κατανοητό πάμε να το δούμε και σε πράξεις.
- Κώδικας: Επιλογή όλων
224/2 = 112 (Η διαίρεση έχει υπόλοιπο 0 το οποίο κρατάμε όπως και το πηλίκο το οποίο θα χρησιμοποιήσουμε στην επόμενη διαίρεση) => 0
112/2=56 (Με υπόλοιπο 0 και πηλίκο 56 το οποίο θα χρησιμοποιήσουμε σε επόμενη διαίρεση) => 0 (κρατάμε το υπόλοιπο)
56/2=28 με υπόλοιπο => 0
28/2 = 14 υπόλοιπο => 0
14/2 = 7 υπόλοιπο => 0
7/2=3 υπόλοιπο => 1
3/2=1 υπόλοιπο => 1
και τέλος 1
Σε αυτο το σημείο λές εχω 00000111 (απο κάτω προς τα πάνω) δηλαδη απο το λιγότερο σημαντικό bit προς το περισσότερο σημαντικό
άρα σύμφωνα και με το παράδειγμα που δώσαμε πιο πάνω με την δομή ενος byte ως προς τα περισσότερο σημαντικότερα και λιγότερο bit η παραπάνω ακολουθία "αντιστρέφεται" αρα τελικά είναι => 11100000 που είναι και το ζητούμενο.
ΔΕΚΑΕΞΑΔΙΚΟ ΣΥΣΤΗΜΑΤο 16-δικό σύστημα αποτελεί και αυτο ένα σύστημα κωδικοποίησης οπως και το δυαδικό . Το 16-δικο σύστημα ειναι περισσότερο human-friendly και χρησιμοποιείται και για την αναπαράσταση των διευθύνσεων του υλικού οπως ειναι οι μνήμες RAM και οι διευθύνσεις MAC για τις οποίες έχει γίνει εκτενής λόγος σε αυτην εδω την παρουσίαση.
Το 16-δικο σύστημα αρίθμησης λοιπον μπορεί να δοθεί απο το παρακάτω πινακάκι
- Κώδικας: Επιλογή όλων
0 1 2 3 4 5 6 7 8 9 A B C D E F
με τις τιμες Α , Β , C , D , E , F να παίρνουν τις τιμές 10,11,12,13,14 και 15 αντίστοιχα.
πάλι υπάρχει και εδω η λογική του 0.... n-1 δηλαδη οπως βλέπουμε αν και 16-δικο δεν παίρνει πουθενά την τιμή 16 δεν υπάρχει δηλαδη κάποιο γράμμα για να κωδικοποιήσει την τιμη 16 γιατι πολυ απλα τιμή 16 δεν υπάρχει μιας και η αρίθμηση ξεκινησε απο το 0.
Για να μετατρέψω έναν αριθμό απο το 16-δικο στο δεκαδικό η λογική είναι ακριβώς... ακριβώς ομως η ίδια με τα 2 βήματα που κάναμε και για το δυαδικό => δεκαδικό απλα εδω θα αλλάξει η βάση οπως ειναι αυτονόητο... απο 2 θα έχουμε πλεον 16.
Πάμε τώρα να δούμε ενα παράδειγμα απο 16-δικο σε δεκαδικό έστω ο αριθμός
D5C2 ο οποίος θέλουμε να μετατραπεί σε δεκαδικό. Πάλι έχουμε ψηφία ... θέσεις (απο 0....n-1 <=> 0...3) και φυσικά την βάση 16 η οποία θα ανυψωθεί στην αντίστοιχει θέση του ψηφιου με το οποίο θα πολλαπλασιαστεί και θα προστεθουν ολα αυτα στο τελος για να δωσουν τον αριθμο στο δεκαδικό σύστημα οπως ακριβώς κάναμε και στο παράδειγμα με το δυαδικό.
Στην θέση 3 βρίσκεται ο D στην θέση 2 βρίσκεται ο 5 στην θέση 1 βρίσκεται ο C και τέλος στην θεση 0 ο 2. Επομένως μένει να πολλαπλασιάσω κάθε ψηφίο με 16^ "ή στην θέση που βρίσκεται αυτο το ψηφίο"
- Κώδικας: Επιλογή όλων
D * 16^3 + 5 *16^2 + C * 16^1 + 2 * 16^0 = 13 * 16^3 + 5 *16^2 + 12 * 16 + 2 * 16^0 // 16^0 = 1 γενικά οτιδήποτε στην μηδενικη δινει 1
=> 192+1280 + 53248 + 2 = 54902
επομένως (D5C2)16 = (54722)10
δηλαδη ο D5C2 στο 16-δικο ειναι ίσος με 54722 στο 10-δικο

Η
εργασία υπάγεται στην άδεια
Creative Commons Αναφορά-Μη εμπορική χρήση-Παρόμοια διανομή 3.0 Ελλάδα
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]