Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Μια χρησιμότητα των bitflags που δεν είδα να αναφέρεται είναι η εξοικονόμηση χώρου. Μέσα σε ένα byte χωράνε 8 boolean τιμές. Αν ορίζονταν ας πούμε ως int (C89/90) τότε θα χρειαζόμασταν 8 x sizeof(int) bytes, κι αν θεωρήσουμε πως ο int είναι 4 bytes καταλήγουμε να καταναλώνουμε 32 bytes αντί για 1.

 

Επίσης, η 1η απάντηση στο link που έδωσε ο Kercyn απαριθμεί δημοφιλείς τομείς στους οποίους ο χειρισμός των bits είναι σημαντικός.

 

+1

 

Στα embedded συστήματα ζουν κ βασιλεύουν ακόμη οι Bitwise τελεστές και τo Bitmasking, βολεύει αρκετά.

  • Like 1
  • Απαντ. 31
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοφιλείς Ημέρες

Συχνή συμμετοχή στο θέμα

Δημοσ.

Μπράβο ρε ημίθεε τσίφτη που τα γράφεις όλα αυτά.

Σιγά το πράγμα, ένα copy-paste έκανα από δύο αρχεία του πυρήνα. Ευχαριστώ πάντως :)

 

 

Προσωπικά έχω παρατηρήσει συγκεκριμένα πως όσο αυξανόταν ή εμπειρία μου τόσο μειωνόταν οι περιπτώσεις που σκεφτόμουν ότι εδώ ένα bitmask είναι καλή ιδέα.

 

 

Να το μάθει κανείς ναι, αλλά κατά τα άλλα (χαριτολογώντας)

 

1. You should not use bitwise ops

2. See 1

Μπορείς να γράψεις ένα σύντομο παράδειγμα του πώς θα έγραφες πχ αυτό που έδειξα με τα quirks ?

 

Γενικά πάντως συμφωνώ ότι όπου μπορείς να τους αποφύγεις, καλό είναι να το κάνεις. Όπως γνωρίζεις, ειδικά σε C έχουν δημιουργήσει πολλές φορές πρόβλημα λόγω των μετατροπών και της προαγωγής των τύπων. Σε πολλούς οδηγούς για "safe c" θα βρεις ολόκληρο κεφάλαιο μόνο για τον one's complement (not) ~ τελεστή :)

 

Μια χρησιμότητα των bitflags που δεν είδα να αναφέρεται είναι η εξοικονόμηση χώρου. Μέσα σε ένα byte χωράνε 8 boolean τιμές.

Ναι δεν το σκέφτηκα αυτό. Θυμάμαι μάλιστα πριν χρόνια σε μια μαθηματική βιβλιοθήκη είχαν αλλάξει την υλοποίησή τους του κόσκινου του Ερατοσθένη με αυτό τον τρόπο για να γλυτώσουν μνήμη. Από εκεί που χρησιμοποιούσε ένα array από chars που έθετε μηδέν σε κάθε θέση του πίνακα που δεν ήταν πρώτος, το έκαναν με bitwise τελεστές και "έσβηναν" το αντίστοιχο bit κάθε φορά που αφαιρούταν ένας αριθμός.
Δημοσ.

+1

 

Στα embedded συστήματα ζουν κ βασιλεύουν ακόμη οι Bitwise τελεστές και τo Bitmasking, βολεύει αρκετά.

 

Όχι μόνο στα ενσωματωμένα. Compression, encryption, networking είναι γενικοί τομείς στους οποίους είναι επίσης διαδεδομένη η χρήση τους. Ο βασικός λόγος είναι αυτός που ανάφερα και συμφώνησες, η εξοικονόμηση χώρου (η οποία π.χ. στα transmissions οδηγεί και σε εξοικονόμηση χρόνου).

 

...ειδικά σε C έχουν δημιουργήσει πολλές φορές πρόβλημα λόγω των μετατροπών και της προαγωγής των τύπων. Σε πολλούς οδηγούς για "safe c" θα βρεις ολόκληρο κεφάλαιο μόνο για τον one's complement (not) ~ τελεστή :)

 

Ειδικά για τα bitflags, αν τα ορίζεις εξαρχής ως unsigned και τα εφαρμόζεις σε unsigned integers γλιτώνεις διάφορες σκοτούρες.

 

Δηλαδή...

#define ANTRAS (1U << 0)
#define PSHLOS (1U << 1)
...
unsigned char traits;

αντί για...

#define ANTRAS (1 << 0)
#define PSHLOS (1 << 1)
...
char traits;

Ναι δεν το σκέφτηκα αυτό. Θυμάμαι μάλιστα πριν χρόνια σε μια μαθηματική βιβλιοθήκη είχαν αλλάξει την υλοποίησή τους του κόσκινου του Ερατοσθένη με αυτό τον τρόπο για να γλυτώσουν μνήμη. Από εκεί που χρησιμοποιούσε ένα array από chars που έθετε μηδέν σε κάθε θέση του πίνακα που δεν ήταν πρώτος, το έκαναν με bitwise τελεστές και "έσβηναν" το αντίστοιχο bit κάθε φορά που αφαιρούταν ένας αριθμός.

 

Ναι, διότι η βασική τους χρησιμότητα είναι η εξοικονόμηση χώρου (οι υπόλοιπες έπονται).

Δημοσ.

 

Όχι μόνο στα ενσωματωμένα. Compression, encryption, networking είναι γενικοί τομείς στους οποίους είναι επίσης διαδεδομένη η χρήση τους. Ο βασικός λόγος είναι αυτός που ανάφερα και συμφώνησες, η εξοικονόμηση χώρου (η οποία π.χ. στα transmissions οδηγεί και σε εξοικονόμηση χρόνου).

 

 

Το παράδειγμα που έφερα παραπάνω ήταν σε networking μεταξύ embedded systems! :D

Δημοσ.

 

 

Το παράδειγμα που έφερα παραπάνω ήταν σε networking μεταξύ embedded systems! :D

 

Το κατάλαβα πως ήταν για ενσωματωμένα, από το IAR (το ότι ήταν και από networking όμως, δεν έδινες αρκετά hints στο post :P)

 

 

 

Btw, και σε GUIs χρησιμοποιούνται bitflags.

Δημοσ.

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

Not really.

 

Μέθοδος συμπίεσης (lossless τουλάχιστον) είναι κάτι που του δίνεις μια είσοδο που περιέχει μια πληροφορία αποθηκευμένη συνολικά σε Χ bits (bytes στην πράξη αλλά λεπτομέρειες) και σου δίνει μια έξοδο που περιέχει την ίδια πληροφορία σε Υ <= Χ bits. Ως εδώ είναι καθαρά θεωρία/μαθηματικά και δεν έχει να κάνει με bitwise τελεστές.

 

Τώρα για να αναπαραστήσεις αυτά τα Y bits όσο το δυνατόν πιο συμπυκνωμένα σε ένα πραγματικό σύστημα είναι πιθανό να χρησιμοποιηθούν στην πράξη bitwise πράξεις, ή και όχι. Αντίστοιχα η χρήση τους δεν είναι περιορισμένη σε διαδικασίες συμπίεσης, π.χ. για να αναπαραστήσεις τον χαρακτήρα "Δ" σε UTF-8 στην πράξη θα χρησιμοποιήσεις bitwise τελεστές, όμως αυτό που κάνεις δεν είναι συμπίεση.

 

Άλλα μπορούμε να βάλουμε στα bits κείμενα?

Τα bits είναι bits, δεν περιέχουν ούτε κείμενα ούτε αριθμούς. Με τον ίδιο ακριβώς τρόπο που τα δεκαδικά ψηφία δεν περιέχουν ούτε τηλέφωνα, ούτε υπόλοιπα λογαριασμών, ούτε ημερομηνίες. Το τι "περιέχουν" έχει να κάνει μόνο με το πώς τα ερμηνεύει ο αναγνώστης. Αν θες να ερμηνεύσεις τα bits σαν τάδε μορφής κωδικοποιημένο κείμενο, τότε περιέχουν κείμενο.

 

Η κάτι που μου ήρθε στα γρήγορα στη σκέψη είναι να φτιάχνουμε και να αποθηκεύουμε τα strings σε αριθμούς που να δηλώνουν το κάθε γραμμα(π.χ. σε unicode/ascii) και μετά να τα ξανά φέρνουμε σε κανονική μορφή.

Αυτή είναι τυπική σκέψη που κάνει πολύς κόσμος σε αρχάριο στάδιο. Η απάντηση είναι πως αυτό που λες δεν έχει νόημα, γιατί "τα bits είναι bits", δεν είναι ούτε γράμματα ούτε αριθμοί μέχρι τη στιγμή που εσύ αποφασίζεις να τα αντιμετωπίσεις ως τέτοια. Κι από τη στιγμή που το τι αντιπροσωπεύουν εξαρτάται από το τι θες εσύ να αντιπροσωπεύουν, το "να κάνουμε τα strings αριθμούς" δε σημαίνει τίποτα.

 

That said, σε όλα τα συστήματα αναπαράστασης κειμένου όντως οι χαρακτήρες αντιστοιχούν σε αριθμούς. Αλλά αυτό γίνεται για να συνεννοούμαστε μεταξύ μας.

 

Μπορείς να γράψεις ένα σύντομο παράδειγμα του πώς θα έγραφες πχ αυτό που έδειξα με τα quirks ?

Σε C ας πούμε θα είχες ένα abstract data type κι ένα μάτσο functions που θα έκαναν read/write τα flags, φαντάζεσαι.

 

quirks_t q;

quirks_set_male(&q);

if (quirks_is_male(q)) ...

 

Τώρα καταλαβαίνεις (και ελπίζω όλοι) ότι δε λέω πως ντε και καλά θα το έγραφα έτσι, ούτε ότι δεν έχουν χρήση τα bitmasks/flags κλπ ούτε τίποτα τέτοιο. Και φυσικά it goes without saying πως όταν φτάνεις στο σημείο να πρέπει να γράψεις bytes on the wire τότε φυσικά ανάλογα με το πρωτόκολλο θα χρησιμοποιήσεις bitwise τελεστές εκεί που χρειάζεται -- αν και αυτό είναι τελείως διαφορετικό σενάριο και αναφέρθηκε από άλλους.

 

Αυτό που λέω είναι ότι όταν δε σε ενδιαφέρει συγκεκριμένα ποιά θα είναι η bitwise αναπαράσταση κάποιου πράγματος τότε πολύ συχνά είναι "σωστότερη" λύση ο τρόπος που θα επιλέξεις να κάνεις την αναπαράσταση να μην είναι με bitwise τελεστές. Είναι καλύτερα long term να δουλεύεις στο επίπεδο αφαίρεσης που ταιριάζει περισσότερο στο λογικό μοντέλο του πράγματος που κάνεις.

 

Όπως είπα και παραπάνω, μου έχει συμβεί αρκετές φορές να κάνω κάτι bitwise και στη συνέχεια (μπορεί μετά από αρκετό καιρό) να το μετανιώσω, ενώ το αντίθετο δε μου έχει συμβεί ποτέ. Και μιλάω για περιπτώσεις που συνέβησαν χρόνια μετά από τη στιγμή που ξεκίνησα να γράφω επαγγελματικά.

 

Αυτό φυσικά δε σημαίνει ότι τα bitwise είναι κακό πράμα ούτε ότι έχω σταματήσει να τα χρησιμοποιώ. Απλά σημαίνει ότι βάσει πειράματος είναι πολύ ευκολότερο το να κάνεις λάθος προς τη μεριά της υπερβολικής χρήσης, επομένως προγραμματίζεις τον εγκέφαλό σου να προβάλλει περισσότερη αντίσταση οταν πάει προς τα κείνη τη μεριά. Τουλάχιστον για μένα, YMMV.

  • Like 2
Δημοσ.

Δηλαδή καλύτερα να μην χρησιμοποιώ υπερβολικά bitwise τελεστές, μόνο εκεί που χρειάζεται?

 

Εγώ σκεφτούμε να τους χρησιμοποιώ για λίγο καιρό, να μάθω τα συν/πλην τους και μετά ελαττώνουμε την χρήση τους.

Γενικά σκεφτομαι να τους δοκιμάζω για λίγο καιρό σε διάφορες γλώσσες και να δω εάν είναι πραγματικά χρήσιμοι , άλλα και αν δεν είναι θα έχω μάθει κάτι που το έχουν οι περισσότερες γλώσσες και δεν θα μου είναι εμπόδιο σε υπερβολικό βαθμό.

Δημοσ.

Να τους χρησιμοποιήσεις όσο τραβάει η ψυχή σου και να μάθεις τα πάντα όλα σχετικά. Αυτό είναι καλό.

 

Αυτό που πρέπει να προσέχεις είναι ότι θα ξέρεις πώς να κάνεις το Α αλλά δε θα ξέρεις ακόμα να κάνεις το Β ή το Γ (ίσως να μην ξέρεις ούτε καν για την ύπαρξή τους), οπότε https://en.wikipedia.org/wiki/Law_of_the_instrument

 

Edit: διάβασα μέχρι το τέλος το παραπάνω λήμμα και τσουπ

 

The notion of a golden hammer, "a familiar technology or concept applied obsessively to many software problems", has been introduced into the information technology literature in 1998 as an anti-pattern: a programming practice to be avoided.
  • Like 2
Δημοσ.

Δηλαδή καλύτερα να μην χρησιμοποιώ υπερβολικά bitwise τελεστές, μόνο εκεί που χρειάζεται?

 

Εγώ σκεφτούμε να τους χρησιμοποιώ για λίγο καιρό, να μάθω τα συν/πλην τους και μετά ελαττώνουμε την χρήση τους.

Γενικά σκεφτομαι να τους δοκιμάζω για λίγο καιρό σε διάφορες γλώσσες και να δω εάν είναι πραγματικά χρήσιμοι , άλλα και αν δεν είναι θα έχω μάθει κάτι που το έχουν οι περισσότερες γλώσσες και δεν θα μου είναι εμπόδιο σε υπερβολικό βαθμό.

 

Γενικώς δεν είναι καλό να χρησιμοποιείς υπερβολικά το οτιδήποτε, δεν αφορά μόνο τους bitwise τελεστές αυτό.

 

Από εκεί κα πέρα, αν δεν σκοπεύεις να ασχοληθείς με κάποιους από τους τομείς που έχουμε αναφέρει ήδη στο νήμα, τότε είναι μάλλον απίθανο να χρειαστεί να ασχοληθείς με bits.

 

Εξαίρεση ίσως αποτελούν τα bitflags, ειδικά αν ασχοληθείς με GUI programming. Αλλά εκεί είναι πολύ εύκολα τα πράγματα, το GUI θα σου δίνει κάποια pre-defined bitflags και ο μακράν συνηθέστερος τελεστής που θα χρειαστείς είναι το OR (|). Με πολύ λιγότερη συνχόντητα ίσως χρειαστείς και το AND (&) για να τσεκάρεις ποια bits είναι αναμμένα. That's it! Και πάλι, είναι πολύ πιθανό αντί να τα κάνεις με bitwise OR και AND να σου δίνει το GUI έτοιμες μεθόδους (π.χ. gui_window_set_decoration( Window *window, boolean onoff );

Δημοσ.

+1

 

Στα embedded συστήματα ζουν κ βασιλεύουν ακόμη οι Bitwise τελεστές και τo Bitmasking, βολεύει αρκετά.

Αυτο δεν ειναι αληθεια. Bitmasking θες μονο για σεταρεις 1-5 registers και αν. Δηλαδη μιλαμε για 0% με 2% του κωδικα να εχει btiwise. Κατι το οποιο δεν το λες "βασιλια"

 

Σιγουρα πρεπει να ξερεις τι ειναι bitwise, ετσι ωστε οταν δεις τιποτα "αυτο | και αυτο" "αυτο & εχει αυτο" κλπ να ξερεις τι ειναι. Αλλα σε γενικες γραμμες, δεν.

Δημοσ.

Btw....

 

Εάν θυμάμαι καλά (πάει και καιρός που ασχολήθηκα) το dot not micro επίσης έχει bit masks, flags κτλ για pin selection σε chips (π.χ. audio chip) και ports. 

 

 

Αλλά δεν είναι και αιχμή της τεχνολογίας το dot not micro. 

Δημοσ.

Αυτο δεν ειναι αληθεια. Bitmasking θες μονο για σεταρεις 1-5 registers και αν. Δηλαδη μιλαμε για 0% με 2% του κωδικα να εχει btiwise. Κατι το οποιο δεν το λες "βασιλια"

...

 

Δεν τα θες μόνο για να σετάρεις registers, αλλά και για να κάνεις pack/unpack data λόγω ελάχιστης μνήμης, καθώς επίσης και για να αποφύγεις χρονοβόρες αριθμητικές πράξεις (π.χ. διαίρεση). Οπότε αυτό το 0% με 2% δεν είναι αλήθεια. Τα bit manipulations είναι από τα πλέον σημαντικά χαρακτηριστικά στο embedded programming.

Δημοσ.

Αυτο δεν ειναι αληθεια. Bitmasking θες μονο για σεταρεις 1-5 registers και αν. Δηλαδη μιλαμε για 0% με 2% του κωδικα να εχει btiwise. Κατι το οποιο δεν το λες "βασιλια"

 

Σιγουρα πρεπει να ξερεις τι ειναι bitwise, ετσι ωστε οταν δεις τιποτα "αυτο | και αυτο" "αυτο & εχει αυτο" κλπ να ξερεις τι ειναι. Αλλα σε γενικες γραμμες, δεν.

 

για να αναφέρω ένα απλό καθημερινό παράδειγμα embedded συστήματος που χρησιμοποιεί βαρέως bitwise operations (και να καταλάβεις ότι κάπου έχεις λάθος, καμμια διάθεση παρεξήγησης, φιλικά το λέω) δες ας πούμε το πως στέλνετε ένα SMS. Πως κατασκευάζετε το PDU προς μετάδοση. 

Δημοσ.

για να αναφέρω ένα απλό καθημερινό παράδειγμα embedded συστήματος που χρησιμοποιεί βαρέως bitwise operations (και να καταλάβεις ότι κάπου έχεις λάθος, καμμια διάθεση παρεξήγησης, φιλικά το λέω) δες ας πούμε το πως στέλνετε ένα SMS. Πως κατασκευάζετε το PDU προς μετάδοση. 

 

 

Μόνο αυτό; 

 

ZigBee network. Στα headers έχει bit sequences για να δείχνει statuses, commands και payloads και ο δεκτής τα καταλαβαίνει με bit operations (defines που έχουν τα bit masks και γίνονται τα operations). 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...