madblue Δημοσ. 24 Αυγούστου 2014 Δημοσ. 24 Αυγούστου 2014 Καλησπέρα παιδια διαβάζω το <<η γλωσσα C σε βάθος>> και συγκεκριμενα τους τυπους δεδομενων κεφ4 σελιδα 93 το παράδειγμα εχει να κανει με bitwise τελεστες και το κατωθι προγραμμα διαβαζει εναν αριθμο απο μια συσκευη μετεορολογιας και απομωνωνωντας τα bit εκτυπωνει το ειδος μετρησης και την τιμη το bit 1 είναι για την σωστη λειτουργια της συσκευης τα bit 6 και 5 αναφερουν το ειδος της μετρησης και τα υπολοιπα την τιμη της εχει ενα παράδειγμα ως εξής #include <stdio.h> main(){ int ar,ok,eidos,timi; printf("Δώσε αριθμο απο την συσκευη"); scanf("%d",&ar); ok = ar&128>>7; eidos = (ar&96)>>5; timi = ar&31; printrf("ok%d ειδος=%d τιμη %d ",ok,eidos,timi"); δεν μπορω να καταλάβω την λειτουργια του τελεστη & με τον αριθμό 128.Το βιβλιο αναφέρει οτι ο τελεστης & μαζι με μια ακεραια τιμη απομονωνει συγκεκριμενα bit ετσι να τα ολισθησουμε με τον τελεστη >> ομως δεν δινει περαιτερω πληροφοριεςσε τι μας χρησιμευει λοιπον αυτος το τελεστης [στην συγκεκριμενη περιπτωση]?
Star_Light Δημοσ. 24 Αυγούστου 2014 Δημοσ. 24 Αυγούστου 2014 Πάρτα με την σειρά ο τελεστής & κάνει την πράξη AND σε κάθε bit των 2 τελεστεών πχ αν έχεις 2 & 3 τοτε δοκιμασε να τα μετατρέψεις σε δυαδικούς (οπως δηλαδη ειναι αποθηκευμενα στην μνημη του Η/Υ) και μετά οπως ειναι κάντα & και το αποτελεσμα που θα πάρεις κάντο μετατροπη απο δυαδικο σε δεκαδικό. Ψάξε στο google για converters απο binary σε decimal ή απο decimal σε binary. Κανε μερικά στο χαρτί για να καταλαβεις πως γινεται η πράξη που δεν ειναι κατι το δυσκολο αν έχεις το πινακάκι και πάρεις ενα ενα τα bits βγαίνει. Επισης υπάρχουν κάποιοι αριθμοι που χρησιμοποιούνται σαν μάσκες για να πάρεις ενα συγκεκριμενο αποτελεσμα. http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-c-c ΥΓ To ok και ar τι ειναι? προσπαθησε να δινεις στις μεταβλητες αντιπροσωπευτικά ονοματα για να καταλαβαινει αυτος που διαβαζει τον κώδικα σου.
madblue Δημοσ. 24 Αυγούστου 2014 Μέλος Δημοσ. 24 Αυγούστου 2014 το παραδειγμα αυτο ειναι αυτουσιο του βιβλιου.... και με εχει δυσκολεψει αρκετα δεν μπορω να καταλάβω την λογικη. το ok ειναι η μεταβλητη καλης καταστασης της συσκευης η γραμμη εχει ως εξης ok = ar&128>>7 ενω πιο πριν με μια scanf εχει ζητηθει μια ar ουσιαστικα θελουμε να απομωνωσουμε το πρωτο bit.. το παραδειγμα αυτο ζηταει.... αφου θελουμε το πρωτο bit δεν μας αρκει μια απλη δεξια ολισθηση 7 φορες? η πραξη AND δεν καταλαβαινω που κολλαει και ο αριθμος 128
Star_Light Δημοσ. 24 Αυγούστου 2014 Δημοσ. 24 Αυγούστου 2014 (επεξεργασμένο) Η πράξη AND ελέγχει ας το πούμε τα αντιστοιχα bit των 2 αριθμών ή μετρησεων αν και οι 2 μετρησεις έχουν στο τάδε bit το 1 ξερω γω τοτε η πράξη AND δινει το αποτέλεσμα 1. Οποτε πάει αυτο και στη συνέχεια θέλουμε να ελέγξουμε το επομενο bit οποτε κάνε μια ολισθηση δεξιά. Εδω ειναι το πινακάκι http://en.wikipedia.org/wiki/AND_gate Για παράδειγμα ο παρακάτω κώδικας μετράει τον αριθμό των άσσων μέσα σε ενα χαρακτήρα #include<stdio.h> int count_ones(unsigned char ch) { unsigned int c; for( c = 0; ch; ch >>=1) c+= ch & 1; // 1 -> 0000001 return c; } int main(void) { unsigned char ch; printf("Enter a character: "); scanf(" %c", &ch); printf("Number of set bits (1) in %c is : " , ch , count_ones(ch)); return 0; } Το 128 ισως ειναι μάσκα δεν ξέρω. Δοκιμασε να κάνεις στο χαρτι ένα παράδειγμα να το καταλάβεις. Αν μπορεις να βρεις την σελιδα απο το google books και να δωσεις το λινκ ισως το δουμε γιατι δεν έχω αυτο το βιβλιο εγω. ΥΓ Το 128 ισως ειναι μάσκα που έχει τα bit που θές στις καθορισμένες θέσεις για τις μετεωρολογικές μετρήσεις δεν θα το ψάξω τωρα γιατι το πρωι ξυπνάω στις 5 και θα πάω να την πέσω τωρα. Παντως η λογική της μάσκας ειναι αυτή δες και το λινκ που σου έχω δωσει απο το stack overflow πιο πάνω. Επεξ/σία 24 Αυγούστου 2014 από Star_Light
bird Δημοσ. 24 Αυγούστου 2014 Δημοσ. 24 Αυγούστου 2014 Αν κάνει απλό shift τότε αν το τερμα αριστερά bit ειναι 1 τότε το shift σμπληρώνει τον αριθμό απο αριστερά με άσους. πχ 10001001 >> 3 --> 11110001 με το να κάνεις &128 στην ουσία σβήνεις το ότι άσους έχεις αριστερότερα από το 7ο bit...
Star_Light Δημοσ. 24 Αυγούστου 2014 Δημοσ. 24 Αυγούστου 2014 madblue οταν λές μάσκα εννοεις πχ πως αν θέλεις να κάνεις toggle ενα bit ενος αριθμου ας πουμε το 4ο δηλαδη να το σβήσεις αν ειναι ανοιχτο ή να το ανοιξεις αν ειναι σβηστό τοτε θα χρειαστεις αυτη την μάσκα -> 00000000 00010000 το κενο δεν υφισταται μπηκε απλα για να σπάσει τα bytes του αριθμου (συνηθως unsigned short int ) για λογους ευκολιας. Αν ο αριθμος λοιπον 00000000 00001001 που ειναι ο 9 σε decimal γινει XOR με την μάσκα που έδωσα πιο πάνω τοτε οντως το 4ο bit θα γινει toggle δηλαδη θα πάρεις τον αριθμο 00000000 00011001 που ειναι ο 25 στο δεκαδικό συστημα αριθμησης. Εν ολιγοις αυτη ειναι η σημασια μιας μάσκας. #include <stdio.h> unsigned short int toggle(unsigned short int value, unsigned short int bit) { return value ^= 1 << bit; } int main(void) { unsigned short int i =9; printf("%d\n", (i=toggle(i,4))); // 25 printf("%d\n", (i=toggle(i,4))); // 9 printf("%d\n", (i=toggle(i,7))); // 137 return 0; }
imitheos Δημοσ. 25 Αυγούστου 2014 Δημοσ. 25 Αυγούστου 2014 Καλησπέρα παιδια διαβάζω το <<η γλωσσα C σε βάθος>> και συγκεκριμενα τους τυπους δεδομενων κεφ4 σελιδα 93 το παράδειγμα εχει να κανει με bitwise τελεστες και το κατωθι προγραμμα διαβαζει εναν αριθμο απο μια συσκευη μετεορολογιας και απομωνωνωντας τα bit εκτυπωνει το ειδος μετρησης και την τιμη το bit 1 είναι για την σωστη λειτουργια της συσκευης τα bit 6 και 5 αναφερουν το ειδος της μετρησης και τα υπολοιπα την τιμη της εχει ενα παράδειγμα ως εξής ok = ar&128>>7; δεν μπορω να καταλάβω την λειτουργια του τελεστη & με τον αριθμό 128.Το βιβλιο αναφέρει οτι ο τελεστης & μαζι με μια ακεραια τιμη απομονωνει συγκεκριμενα bit ετσι να τα ολισθησουμε με τον τελεστη >> ομως δεν δινει περαιτερω πληροφοριες σε τι μας χρησιμευει λοιπον αυτος το τελεστης [στην συγκεκριμενη περιπτωση]? το παραδειγμα αυτο ειναι αυτουσιο του βιβλιου.... και με εχει δυσκολεψει αρκετα δεν μπορω να καταλάβω την λογικη. το ok ειναι η μεταβλητη καλης καταστασης της συσκευης η γραμμη εχει ως εξης ok = ar&128>>7 ενω πιο πριν με μια scanf εχει ζητηθει μια ar ουσιαστικα θελουμε να απομωνωσουμε το πρωτο bit.. το παραδειγμα αυτο ζηταει.... αφου θελουμε το πρωτο bit δεν μας αρκει μια απλη δεξια ολισθηση 7 φορες? η πραξη AND δεν καταλαβαινω που κολλαει και ο αριθμος 128 Καταρχήν ας περιγράψουμε την λογική πράξη AND. Όπως λέει και το όνομά της, για να δώσει αποτέλεσμα 1 πρέπει τα ορίσματα που θα λάβει να έχουν και τα δύο τιμή 1. Σε οποιαδήποτε άλλη περίπτωση το αποτέλεσμα είναι 0. Το & τώρα είναι bitwise AND τελεστής δηλαδή πραγματοποιεί την πράξη AND σε κάθε bit των δύο ορισμάτων. Το ένα όρισμα σου όμως είναι ο αριθμός 128 δηλαδή σε δυαδικό το 10000000. Όπως βλέπεις, όλα τα bit του 128 εκτός από ένα έχουν τιμή 0 οπότε ανεξάρτητα από τι τιμή έχουν τα αντίστοιχα bit του ok, το αποτέλεσμα θα έχει 0 σε αυτά και μόνο το high bit ενδέχεται να έχει τιμή 1. Δηλαδή δίνοντας στον τελεστή & ένα όρισμα το οποίο να είναι δύναμη του 2 μπορούμε να απομονώσουμε ένα συγκεκριμένο bit από τον αριθμό που μας ενδιαφέρει. Για αυτό το λόγο υπάρχει η έκφραση ar & 128. Ο τελεστής όμως απλά εκτελεί την πράξη AND οπότε αν για παράδειγμα το ar έχει τιμή 131 (δηλαδή 128 + 2 + 1 άρα 10000011) τότε η έκφραση ar & 128 θα "μηδενίσει" τα δύο πρώτα bits και θα μας δώσει αποτέλεσμα 128. Εμάς όμως θα μας βόλευε να έχουμε τιμή 0 ή 1 οπότε πρέπει να ολισθήσουμε κάποιες θέσεις το αποτέλεσμα. Έτσι η ολοκληρωμένη έκφραση είναι (ar & 128) >> 7 Γιατί τώρα δεν αρκεί μια απλή ολίσθηση 7 θέσεων ? Η μεταβλητή ar έχει τύπο int δηλαδή έχει μέγεθος τουλάχιστον δύο bytes οπότε μπορεί να έχει τιμή πχ 271 δηλαδή τιμή που να ξεπερνά τα 8 bit και η ολίσθηση να τα διατηρήσει. Ένα άλλο ενδεχόμενο που όμως δεν μας ενδιαφέρει εδώ, είναι να έχουμε αρνητική τιμή οπότε το πρώτο bit θα είναι 1 για να δηλώσει το πρόσημο και η ολίσθηση θα πραγματοποιήσει "sign extend" δηλαδή θα διατηρήσει το bit και δεν θα σου δουλέψει ούτε τότε. Εξαρτάται λοιπόν από το εύρος των τιμών που επιστρέφει η συσκεή μετεωρολογίας. Αν το εύρος είναι 0 - 255 (και η μεταβλητή σου έχει τύπο τουλάχιστον unsigned char) τότε αρκεί η ολίσθηση. Μην ξεχνάς επίσης ότι είναι παράδειγμα σε βιβλίο και έτυχε να ζητάει το high bit. Αν όμως ήθελες το δεύτερο στη σειρά high bit τότε τι θα έκανες ? Η έκφραση ar >> 6 θα σου έδινε επίσης και το high οπότε πάλι δεν γίνεται. Έτσι λοιπόν όταν θέλεις ένα συγκεκριμένο bit (έστω το k) ενός θετικού αριθμού, χρησιμοποείς ar & (1 << k) >> k 3
MeTaXaS4 Δημοσ. 25 Αυγούστου 2014 Δημοσ. 25 Αυγούστου 2014 για να συμπληρώσω τον imitheos, αν όντως η μεταβλητή σου ar ήταν 1 byte τότε θα ήσουν οκ, αλλά είναι int, οπότε πρέπει να "μηδενίσεις" τα υπόλοιπα δεδομένα που έχεις μέσα στην μεταβλητή σου και αυτό γίνεται με την πράξη AND, έπειτα κάνει την ολίσθηση και βλέπει μόνο το 1 bit που ήθελε. εφόσον το ar είναι int τότε λέμε για 4 bytes ας πούμε ότι είναι ο αριθμός 00000000 01010101 00000000 10001010αν κάνεις λογική πράξη and με το 128 δηλαδή με τον 00000000 00000000 00000000 10000000τότε θα έχεις αποτέλεσμα00000000 00000000 00000000 10000000 μετά κάνεις την ολίσθηση και έχεις 00000000 00000000 00000000 00000001 ελπίζω να βοήθησα να καταλάβεις την διαδικασία
H_ANARXIA_EINAI_PSEMA Δημοσ. 25 Αυγούστου 2014 Δημοσ. 25 Αυγούστου 2014 Μα γιατί να διαβάσεις την <<Γλώσσα C σε βάθος>>; Τόσα καλά βιβλία στα αγγλικά υπάρχουν...
παπι Δημοσ. 26 Αυγούστου 2014 Δημοσ. 26 Αυγούστου 2014 Θα ηταν βολικοτερο να χρησιμοποιεις hex και οχι αριθμους. Επειδη ειναι repeating pattern. Εαν θυμασαι τα παρακατω, μπορεις να δεις το καθε bit οπου και να ειναι χωρις να κανεις περιπλοκες πραξεις. 0x0 = 0000 0x1 = 0001 0x2 = 0010 0x4 = 0100 0x8 = 1000 πχ το 128 (2^7 aka 7bit) => 0x40 (4=> το 3bit στη δευτερη τετραδα 0=> κανενα bit στη πρωτη τετραδα) το 96 (2^5 + 2^6 aka 5&6bit) => 0x30 ( 0x1 πρωτο bit απο την δευτερη τετραδα + 0x2 δευτερο bit απο την δευτερη τετραδα) 1
nikosxatz Δημοσ. 27 Αυγούστου 2014 Δημοσ. 27 Αυγούστου 2014 To 128 έχει δυαδική απεικόνιση 10000000 και χρησιμοποιείται ως μάσκα. Η πράξη ar&128 έχει ως αποτέλεσμα να απομονώσει το αντίστοιχο bit του αριθμού ar. Τέλος η ολίσθηση κατά 7 θέσεις αριστερά, έχει ως αποτέλεσμα ο αριθμός που θα προκύψει να είναι 1 ή 0. Όμως υπάρχει ένα μικρό λαθάκι το οποίο θα διορθωθεί στην επόμενη ανατύπωση. Η πρόταση υπολογισμού της μεταβλητής ok θα πρέπει να είναι ok = (ar&128)>>7; διότι ο τελεστής ολίσθησης >> έχει μεγαλύτερη προτεραιότητα από τον bitwise τελεστή & Ο Συγγραφέας Νίκος Χατζηγιαννάκης Υ.Γ: Σε κάθε περίπτωση σας ευχαριστώ πολύ για την επιλογή των βιβλίων μου. 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα