Giorgos65ert Δημοσ. 1 Σεπτεμβρίου 2015 Δημοσ. 1 Σεπτεμβρίου 2015 Γεια σας παιδιά έχω ένα θέμα ενώ βλέπω ότι η περισσότερες μοντέρνες και παλιές γλώσσες προγραμματισμου έχουν τελεστές και εντολές για τα Bits άλλα εγώ δεν καταλαβαίνω που είναι η χρησιμότητα τους... δηλαδή τι ακριβώς κάνουν φτιάχνουν τίποτα επεμβαίνουν κάπου τι κάνουν τέλος πάντων ?? Μου λέτε ποια η χρησιμότητα τους? η έχετε κάποιο guide/tutorial κάτι για να με βοηθήσει να καταλάβω?
Moderators Kercyn Δημοσ. 1 Σεπτεμβρίου 2015 Moderators Δημοσ. 1 Σεπτεμβρίου 2015 Αυτοί οι τελεστές είναι πολύ χρήσιμοι αν κάνεις οποιοδήποτε προγραμματισμό hardware ή θες να κατέβεις στο επίπεδό του (drivers κλπ) ή αν θες να χρησιμοποιήσεις bit fields (δηλαδή πεδία όπου αποθηκεύεις πληροφορίες με τη μορφή true/false, δηλαδή 0/1). Περισσότερα εδώ. 1
Giorgos65ert Δημοσ. 1 Σεπτεμβρίου 2015 Μέλος Δημοσ. 1 Σεπτεμβρίου 2015 Και δηλαδή αυτά τα 0101 πρέπει να τα μάθω απέξω για να μπορώ να τα κάνω και να καταλάβω καλύτερα?
CtrlFreak Δημοσ. 1 Σεπτεμβρίου 2015 Δημοσ. 1 Σεπτεμβρίου 2015 11001110 10001100 11001111 10000111 11001110 10111001 00100000 11001111 10000110 11001111 10000101 11001111 10000011 11001110 10111001 11001110 10111010 11001110 10101100 00101110 00100000 1
imitheos Δημοσ. 1 Σεπτεμβρίου 2015 Δημοσ. 1 Σεπτεμβρίου 2015 Εκτός από πράξεις, μια συχνή χρήση τους είναι η υλοποίηση σημαιών που υποδηλώνουν χαρακτηριστικά. Αυτό μπορεί να γίνει για κάποιο hardware όπως είπε ο Kercyn, για ένα παιχνίδι, κτλ. Σκέψου το σαν μια κονσόλα με πολλούς διακόπτες που ο καθένας κάνει μια λειτουργία και μπορείς να "ανάψεις" όποιον συνδυασμό διακοπτών θέλεις. Σκέψου ότι έχεις ένα πρόγραμμα με πελάτες που κάνει κάτι με βάση τα χαρακτηριστικά του πελάτη. Μια μορφή θα μπορούσε να ήταν. If (Kercyn) { ο kercyn είναι άντρας οπότε κάνε αυτό και εκείνο που έχουν σχέση με τον άντρα. ο kercyn είναι δεξιόχειρας οπότε κάνε το τάδε και το δείνα που έχουν σχέση με τους δεξιόχειρες } if (imitheos) { ο imitheos είναι άντρας οπότε κάνε αυτό και εκείνο που έχουν σχέση με τον άντρα. o imitheos είναι ψηλός οπότε κάνε το άλλο και το παράλλο που έχουν σχέση με τους ψηλούς } Με αυτό τον τρόπο, γράφεις πολλές φορές τον ίδιο κώδικα άσκοπα και επίσης δεν είναι scalable ο κώδικας. Κάθε φορά που προσθέτεις ένα νέο άνθρωπο, πρέπει να γράψεις ένα κατεβατό. Ας δούμε πως θα μπορούσε να γίνει με τη χρήση των "bits" για τον ορισμό σημαιών και με τους bitwise τελεστές. Πρώτος τρόπος δήλωσης enum { ANTRAS = 1, PSHLOS = 2, XONTROS = 4, DEKSIOXEIRAS = 8, κτλ }; Δεύτερος τρόπος δήλωσης: enum { ANTRAS = 1 << 0, PSHLOS = 1 << 1, XONTROS = 1 << 2, DEKSIOXEIRAS = 1 << 3, κτλ }; Τρίτος τρόπος δήλωσης: #define ANTRAS (1 << 0) #define PSHLOS (1 << 1) #define XONTROS (1 << 2) #define DEKSIOXEIRAS (1 << 3) Η υλοποίηση είναι σε γλώσσα C αλλά και στις άλλες γλώσσες θα έχει παρόμοια σύνταξη. Ο τρόπος που συναντάς πιο πολύ είναι ο τρίτος με το #define. Έπειτα αυτό σου επιτρέπει να ορίζεις τα χαρακτηριστικά που θέλεις δηλαδή πχ να πεις: Kercyn = ANTRAS | DEKSIOXEIRAS; Imitheos = ANTRAS | XONTROS | PSHLOS; if (μεταβλητή & ANTRAS) { κάνε κάτι; } if (μεταβλητή & PSHLOS) { κάνε κάτι άλλο; } Τώρα ο κώδικας υπάρχει μόνο μία φορά και είναι scalable. Για κάθε νέο πελάτη που προσθέτεις, απλά βάζεις μια καταχώρηση που λέει τι χαρακτηριστικά έχει ο πελάτης. Ο υπόλοιπος κώδικας είναι generic και τρέχει χωρίς να τον νοιάζει αν τρέχει για τον Kercyn ή για τον imitheo για οποιονδήποτε. Πολλές φορές σε κώδικα από RPG και γενικά σε παιχνίδια θα δεις κώδικα "if (item & EQUIPPABLE) κάνε κάτι". Ορίζεις σημαίες μία φορά στη δομή του item και μετά χρειάζεσαι ένα if αντί για δέκα που θα ήθελες διαφορετικά. Στο hardware που ανέφερε ο Kercyn, αυτό το είδος γραφής το βλέπεις παντού στον πυρήνα του linux για να υλοποιηθούν "quirks" δηλαδή να παραξενιές συσκευών που δεν υλοποιούν σωστά κάποιο πρότυπο. Ειδικά σε USB που υπάρχουν ένα κάρο μη-compliant συσκευές και σε SATA λόγω των SSD, το βλέπεις συνέχεια. include/linux/libata.h: ATA_HORKAGE_NODMA = (1 << 1), /* DMA problems */ ATA_HORKAGE_NONCQ = (1 << 2), /* Don't use NCQ */ ATA_HORKAGE_BROKEN_HPA = (1 << 4), /* Broken HPA */ ATA_HORKAGE_FIRMWARE_WARN = (1 << 12), /* firmware update warning */ ATA_HORKAGE_NO_NCQ_TRIM = (1 << 19), /* don't use queued TRIM */ ATA_HORKAGE_NOLPM = (1 << 20), /* don't use LPM */ ATA_HORKAGE_ZERO_AFTER_TRIM = (1 << 22),/* guarantees zero after trim */ ATA_HORKAGE_NOTRIM = (1 << 24), /* don't use TRIM */ Αυτοί είναι κάποιοι χαρακτηριστικοί ορισμοί από τους πολλούς που υπάρχουν για το ATA πρωτόκολλο (δηλαδή σκληρούς, dvd, κτλ). drivers/ata/libata-core.c static const struct ata_blacklist_entry ata_device_blacklist [] = { /* Devices with DMA related problems under Linux */ { "SanDisk SDP3B", NULL, ATA_HORKAGE_NODMA }, { "Toshiba CD-ROM XM-6202B", NULL, ATA_HORKAGE_NODMA }, /* Devices where NCQ should be avoided */ /* NCQ is slow */ { "WDC WD740ADFD-00", NULL, ATA_HORKAGE_NONCQ }, /* NCQ is broken */ { "Maxtor *", "BANC*", ATA_HORKAGE_NONCQ }, { "ST380817AS", "3.42", ATA_HORKAGE_NONCQ }, /* Seagate NCQ + FLUSH CACHE firmware bug */ { "ST31500341AS", "SD1[5-9]", ATA_HORKAGE_NONCQ | ATA_HORKAGE_FIRMWARE_WARN }, /* devices that don't properly handle queued TRIM commands */ { "Crucial_CT*MX100*", "MU01", ATA_HORKAGE_NO_NCQ_TRIM | ATA_HORKAGE_ZERO_AFTER_TRIM, }, { "Samsung SSD 8*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | ATA_HORKAGE_ZERO_AFTER_TRIM, }, if (dev->horkage & ATA_HORKAGE_NONCQ) { snprintf(desc, desc_sz, "NCQ (not used)"); return 0; } if ((dev->horkage & ATA_HORKAGE_FIRMWARE_WARN) && print_info) { ata_dev_warn(dev, "WARNING: device requires firmware update to be fully functional\n"); ata_dev_warn(dev, " contact the vendor or visit http://ata.wiki.kernel.org\n"); } Υπό άλλες συνθήκες θα έπρεπε να έχεις κώδικα του στυλ: if (έχουμε SanDisk SDP3B) κλείσε το dma if (έχουμε ST31500341AS) { κλείσε το dma εμφάνισε warning για το firmware } ..... ή του στυλ: if (έχουμε SanDisk SDP3B ή ST31500341AS ή .....) κλείσε το dma if (έχουμε ST31500341AS) εμφάνισε warning για το firmware δηλαδή να έχεις if για κάθε συσκευή και κάθε φορά που βρίσκεις μια νέα προβληματική συσκευή να πρέπει να αλλάξεις τον κώδικα σε 15 σημεία. Με αυτή την μαγκιά με τις σημαίες, ο κώδικάς σου είναι πιο scalable γιατί γράφεις μια φορά τον γενικό κώδικα και μετά απλά έχεις μια "βάση δεδομένων" με ποιες σημαίες - χαρακτηριστικά διέπουν την κάθε συσκευή. 7
Giorgos65ert Δημοσ. 1 Σεπτεμβρίου 2015 Μέλος Δημοσ. 1 Σεπτεμβρίου 2015 Εκτός από πράξεις, μια συχνή χρήση τους είναι η υλοποίηση σημαιών που υποδηλώνουν χαρακτηριστικά. Αυτό μπορεί να γίνει για κάποιο hardware όπως είπε ο Kercyn, για ένα παιχνίδι, κτλ. Σκέψου το σαν μια κονσόλα με πολλούς διακόπτες που ο καθένας κάνει μια λειτουργία και μπορείς να "ανάψεις" όποιον συνδυασμό διακοπτών θέλεις. Πρώτος τρόπος δήλωσης enum { ANTRAS = 1, PSHLOS = 2, XONTROS = 4, DEKSIOXEIRAS = 8, κτλ }; Δεύτερος τρόπος δήλωσης: enum { ANTRAS = 1 << 0, PSHLOS = 1 << 1, XONTROS = 1 << 2, DEKSIOXEIRAS = 1 << 3, κτλ }; Τρίτος τρόπος δήλωσης: #define ANTRAS (1 << 0) #define PSHLOS (1 << 1) #define XONTROS (1 << 2) #define DEKSIOXEIRAS (1 << 3) Η υλοποίηση είναι σε γλώσσα C αλλά και στις άλλες γλώσσες θα έχει παρόμοια σύνταξη. Ο τρόπος που συναντάς πιο πολύ είναι ο τρίτος με το #define. Έπειτα αυτό σου επιτρέπει να ορίζεις τα χαρακτηριστικά που θέλεις δηλαδή πχ να πεις: Kercyn = ANTRAS | DEKSIOXEIRAS; Imitheos = ANTRAS | XONTROS | PSHLOS; if (μεταβλητή & ANTRAS) { κάνε κάτι; } if (μεταβλητή & PSHLOS) { κάνε κάτι άλλο; } Για κάθε σημαία που "ανάβεις", ανάβει και ένα bit οπότε η μεταβλητή Kercyn θα έχει άλλο αριθμό από την μεταβλητή Imitheos. Κάπου θα έχεις κώδικα σαν τον παραπάνω με τα if. Οι τελεστές bitwise σου επιτρέπουν να μην σε νοιάζει εσένα ποιος είναι αυτός ο αριθμός και να δουλεύεις μόνο με τις σημαίες. Αν αύριο αλλάξει το PSHLOS και πάρει άλλο bit, δεν θα χρειαστεί να αλλάξει καθόλου ο κώδικάς σου. Πολλές φορές σε κώδικα από RPG και γενικά σε παιχνίδια θα δεις κώδικα "if (item & EQUIPPABLE) κάνε κάτι". Ορίζεις σημαίες μία φορά στη δομή του item και μετά χρειάζεσαι ένα if αντί για δέκα που θα ήθελες διαφορετικά. Στο hardware που ανέφερε ο Kercyn, αυτό το είδος γραφής το βλέπεις παντού στον πυρήνα του linux για να υλοποιηθούν "quirks" δηλαδή να παραξενιές συσκευών που δεν υλοποιούν σωστά κάποιο πρότυπο. Ειδικά σε USB που υπάρχουν ένα κάρο μη-compliant συσκευές και σε SATA λόγω των SSD, το βλέπεις συνέχεια. include/linux/libata.h: ATA_HORKAGE_NODMA = (1 << 1), /* DMA problems */ ATA_HORKAGE_NONCQ = (1 << 2), /* Don't use NCQ */ ATA_HORKAGE_BROKEN_HPA = (1 << 4), /* Broken HPA */ ATA_HORKAGE_FIRMWARE_WARN = (1 << 12), /* firmware update warning */ ATA_HORKAGE_NO_NCQ_TRIM = (1 << 19), /* don't use queued TRIM */ ATA_HORKAGE_NOLPM = (1 << 20), /* don't use LPM */ ATA_HORKAGE_ZERO_AFTER_TRIM = (1 << 22),/* guarantees zero after trim */ ATA_HORKAGE_NOTRIM = (1 << 24), /* don't use TRIM */ Αυτοί είναι κάποιοι χαρακτηριστικοί ορισμοί από τους πολλούς που υπάρχουν για το ATA πρωτόκολλο (δηλαδή σκληρούς, dvd, κτλ). drivers/ata/libata-core.c static const struct ata_blacklist_entry ata_device_blacklist [] = { /* Devices with DMA related problems under Linux */ { "SanDisk SDP3B", NULL, ATA_HORKAGE_NODMA }, { "Toshiba CD-ROM XM-6202B", NULL, ATA_HORKAGE_NODMA }, /* Devices where NCQ should be avoided */ /* NCQ is slow */ { "WDC WD740ADFD-00", NULL, ATA_HORKAGE_NONCQ }, /* NCQ is broken */ { "Maxtor *", "BANC*", ATA_HORKAGE_NONCQ }, { "ST380817AS", "3.42", ATA_HORKAGE_NONCQ }, /* Seagate NCQ + FLUSH CACHE firmware bug */ { "ST31500341AS", "SD1[5-9]", ATA_HORKAGE_NONCQ | ATA_HORKAGE_FIRMWARE_WARN }, /* devices that don't properly handle queued TRIM commands */ { "Crucial_CT*MX100*", "MU01", ATA_HORKAGE_NO_NCQ_TRIM | ATA_HORKAGE_ZERO_AFTER_TRIM, }, { "Samsung SSD 8*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | ATA_HORKAGE_ZERO_AFTER_TRIM, }, if (dev->horkage & ATA_HORKAGE_NONCQ) { snprintf(desc, desc_sz, "NCQ (not used)"); return 0; } if ((dev->horkage & ATA_HORKAGE_FIRMWARE_WARN) && print_info) { ata_dev_warn(dev, "WARNING: device requires firmware update to be fully functional\n"); ata_dev_warn(dev, " contact the vendor or visit http://ata.wiki.kernel.org\n"); } Υπό άλλες συνθήκες θα έπρεπε να έχεις κώδικα του στυλ: if (έχουμε SanDisk SDP3B) κλείσε το dma if (έχουμε ST31500341AS) { κλείσε το dma εμφάνισε warning για το firmware } ..... ή του στυλ: if (έχουμε SanDisk SDP3B ή ST31500341AS ή .....) κλείσε το dma if (έχουμε ST31500341AS) εμφάνισε warning για το firmware δηλαδή να έχεις if για κάθε συσκευή και κάθε φορά που βρίσκεις μια νέα προβληματική συσκευή να πρέπει να αλλάξεις τον κώδικα σε 15 σημεία. Με αυτή την μαγκιά με τις σημαίες, ο κώδικάς σου είναι πιο scalable γιατί γράφεις μια φορά τον γενικό κώδικα και μετά απλά έχεις μια "βάση δεδομένων" με ποιες σημαίες - χαρακτηριστικά διέπουν την κάθε συσκευή. θα κάνω αρκετές δοκιμές για να δω τι κάνει το κάθε ένα , παντός 1000 ευχαριστώ!!
imitheos Δημοσ. 1 Σεπτεμβρίου 2015 Δημοσ. 1 Σεπτεμβρίου 2015 θα κάνω αρκετές δοκιμές για να δω τι κάνει το κάθε ένα , παντός 1000 ευχαριστώ!! Ο bitwise τελεστής OR | "ανάβει" το/τα bit που του δίνεις. Έτσι όταν έβαλα Imitheos = ANTRAS | PSHLOS | XONTROS αυτό σημαίνει άναψε τα bit 0, 1, 2 οπότε προκύπτει ο αριθμός 1 + 2 + 4 = 7 Μετά με τον τελεστή AND & ελέγχεις αν είναι αναμμένο κάποιο bit. Λέγοντας "If (μεταβλητή & ANTRAS)" ελέγχεις αν είναι αναμμένο το bit 0 το οποίο θα είναι μόνο για όσες περιπτώσεις έχεις πει εσύ ότι έχεις άνδρα. Το κλειδί είναι ότι χρησιμοποιείς πάντα δυνάμεις του δύο. Αν είχα ANTRAS = 1 PSHLOS = 2 XONTROS = 3 τότε δεν θα μπορούσε να δουλέψει ο κώδικας γιατί δεν θα μπορούσε να ξεχωρίσει ανάμεσα σε κάποια χοντρή γυναίκα (3 λόγω του χοντρός) ή σε ένα ψηλό άντρα (1 λόγω του άντρας + 2 λόγω του ψηλός). 1
Giorgos65ert Δημοσ. 1 Σεπτεμβρίου 2015 Μέλος Δημοσ. 1 Σεπτεμβρίου 2015 έκανα αρκετή εξάσκηση και ναι κατάλαβα περίπου πολλά π.χ. κατάλαβα ότι ο τελεστής >> κάνει διαίρεση με την άλλη τιμή κάπως έτσι: A = 1 << 2 // 4 B = A >> 2 // 1 γενικά όλους τους κατάλαβα τι κάνουν ακόμα και ~ >>= <<= και έπαιξα με το if else π.χ. εάν μεταβλητή & ANTRAS & XONTROS ,δεν βγάζει το επιθυμητό αποτέλεσμα και έβαλα να δοκιμάσω εάν μεταβλητή & (ANTRAS | XONTROS) και έβγαλε το επιθυμητό αποτέλεσμα. Ευχαριστώ όλους για την βοήθεια είστε η καλύτεροι!
Moderators Kercyn Δημοσ. 1 Σεπτεμβρίου 2015 Moderators Δημοσ. 1 Σεπτεμβρίου 2015 Το ANTRAS & XONTROS θα σου δίνει πάντα 0. Αν το ANTRAS είναι το 0001 και το XONTROS το 0010, τότε 0001 & 0010 = 0000 γιατί σε κανένα από τα δύο δεν υπάρχει άσσος στο ίδιο σημείο. το ANTRAS | XONTROS θα σου δώσει 0011, δηλαδή true στη C. Μπράβο ρε ημίθεε τσίφτη που τα γράφεις όλα αυτά.
groot Δημοσ. 2 Σεπτεμβρίου 2015 Δημοσ. 2 Σεπτεμβρίου 2015 Μία δική μου εμπειρία... Σε πρωτόκολλο επικοινωνίας με μηχανηματάκια με 8056 έπρεπε να μεταδοθούν κάποια flags. Τα οποία ήταν (π.χ.) Κατηγορία 1. Κατηγορία 1.1 Κατηγορία 1.1.1 Κατηγορία 1.1.2 Κατηγορία 2. Κατηγορία 2.1. Οπότε..... μισή 16bit λέξη ήταν για τα major cases και η άλλη μισή για τα υπό-cases. Δηλαδή... από το 0000 0000 0000 0000, τα πρώτα 8 έδειχναν major κατηγορία και τα άλλα minor. Στο appropriate header (plain C γλώσσα, με ένα framework με άθλιο documentation και με IDE το IAR με όλα τα ωραία του) υπήρχε το definition των εκάστοτε flags... δηλαδή (π.χ) major κατηγορία 1 = 0000 0001 0000 0000 Από εκεί και πέρα, όπως τα λέει ο imitheos (που τα είπε αρκετά καλά). Υ.Γ. Είναι πολύ απλοποιημένο παράδειγμα...
παπι Δημοσ. 2 Σεπτεμβρίου 2015 Δημοσ. 2 Σεπτεμβρίου 2015 Γεια σας παιδιά έχω ένα θέμα ενώ βλέπω ότι η περισσότερες μοντέρνες και παλιές γλώσσες προγραμματισμου έχουν τελεστές και εντολές για τα Bits άλλα εγώ δεν καταλαβαίνω που είναι η χρησιμότητα τους... δηλαδή τι ακριβώς κάνουν φτιάχνουν τίποτα επεμβαίνουν κάπου τι κάνουν τέλος πάντων ?? Μου λέτε ποια η χρησιμότητα τους? η έχετε κάποιο guide/tutorial κάτι για να με βοηθήσει να καταλάβω? Μπορει και να μην βρεις κατι χρησιμο. Ο λογος υπαρξης τους ειναι απλος, ο υπολογιστης δουλευει με λογικες πυλες. 11001110 10001100 11001111 10000111 11001110 10111001 00100000 11001111 10000110 11001111 10000101 11001111 10000011 11001110 10111001 11001110 10111010 11001110 10101100 00101110 00100000 Αν το εγραφες σε greeklish θα ηταν καλυτερα. Τωρα με extend code page, τρεχα γυρευε 1
defacer Δημοσ. 2 Σεπτεμβρίου 2015 Δημοσ. 2 Σεπτεμβρίου 2015 Ακαδημαϊκά να αναφέρω ότι παρόλο που το θέμα μιλάει στενά για bitwise τελεστές και το παράδειγμα του ημίθεου είναι βέβαια απλά ενδεικτικό, η χρήση bits με τέτοιο τρόπο είναι imo μια κακή συνήθεια κατάλοιπο άλλων εποχών. Το σκεπτικό μου είναι πως ενώ η ιδέα των flags είναι βέβαια γενική ως concept και δεν υπάρχει τίποτα στραβό μ'αυτή, τα bitwise κόλπα είναι (στις περισσότερες γλώσσες, όπου υπάρχουν και πιο δομημένες επιλογές) ένα περιοριστικό implementation detail από το οποίο "δεν υπάρχει γυρισμός". Προσωπικά έχω παρατηρήσει συγκεκριμένα πως όσο αυξανόταν ή εμπειρία μου τόσο μειωνόταν οι περιπτώσεις που σκεφτόμουν ότι εδώ ένα bitmask είναι καλή ιδέα. Να το μάθει κανείς ναι, αλλά κατά τα άλλα (χαριτολογώντας) 1. You should not use bitwise ops 2. See 1 1
migf1 Δημοσ. 2 Σεπτεμβρίου 2015 Δημοσ. 2 Σεπτεμβρίου 2015 Μια χρησιμότητα των bitflags που δεν είδα να αναφέρεται είναι η εξοικονόμηση χώρου. Μέσα σε ένα byte χωράνε 8 boolean τιμές. Αν ορίζονταν ας πούμε ως int (C89/90) τότε θα χρειαζόμασταν 8 x sizeof(int) bytes, κι αν θεωρήσουμε πως ο int είναι 4 bytes καταλήγουμε να καταναλώνουμε 32 bytes αντί για 1. Επίσης, η 1η απάντηση στο link που έδωσε ο Kercyn απαριθμεί δημοφιλείς τομείς στους οποίους ο χειρισμός των bits είναι σημαντικός. 1
Giorgos65ert Δημοσ. 2 Σεπτεμβρίου 2015 Μέλος Δημοσ. 2 Σεπτεμβρίου 2015 Το ANTRAS & XONTROS θα σου δίνει πάντα 0. Αν το ANTRAS είναι το 0001 και το XONTROS το 0010, τότε 0001 & 0010 = 0000 γιατί σε κανένα από τα δύο δεν υπάρχει άσσος στο ίδιο σημείο. το ANTRAS | XONTROS θα σου δώσει 0011, δηλαδή true στη C. Μπράβο ρε ημίθεε τσίφτη που τα γράφεις όλα αυτά. Αυτό το κατάλαβα στην πορεία εκεί που νόμιζα ότι ANTRAS | XONTROS έβγαζε αυτό που ήθελα, έβαλα κι άλλα για να δω αν βγάλει λάθος και έβγαζε σωστό... Μια χρησιμότητα των bitflags που δεν είδα να αναφέρεται είναι η εξοικονόμηση χώρου. Μέσα σε ένα byte χωράνε 8 boolean τιμές. Αν ορίζονταν ας πούμε ως int (C89/90) τότε θα χρειαζόμασταν 8 x sizeof(int) bytes, κι αν θεωρήσουμε πως ο int είναι 4 bytes καταλήγουμε να καταναλώνουμε 32 bytes αντί για 1. Επίσης, η 1η απάντηση στο link που έδωσε ο Kercyn απαριθμεί δημοφιλείς τομείς στους οποίους ο χειρισμός των bits είναι σημαντικός. Ενδιαφέρον αυτό, μάλλον οι μέθοδοι συμπίεσης κάτι τέτοιο παρόμοιο θα χρησιμοποιούν για να κάνουν εξοικονόμηση χώρου, Άλλα μπορούμε να βάλουμε στα bits κείμενα? Η κάτι που μου ήρθε στα γρήγορα στη σκέψη είναι να φτιάχνουμε και να αποθηκεύουμε τα strings σε αριθμούς που να δηλώνουν το κάθε γραμμα(π.χ. σε unicode/ascii) και μετά να τα ξανά φέρνουμε σε κανονική μορφή.
migf1 Δημοσ. 2 Σεπτεμβρίου 2015 Δημοσ. 2 Σεπτεμβρίου 2015 ... Ενδιαφέρον αυτό, μάλλον οι μέθοδοι συμπίεσης κάτι τέτοιο παρόμοιο θα χρησιμοποιούν για να κάνουν εξοικονόμηση χώρου, Άλλα μπορούμε να βάλουμε στα bits κείμενα? Η κάτι που μου ήρθε στα γρήγορα στη σκέψη είναι να φτιάχνουμε και να αποθηκεύουμε τα strings σε αριθμούς που να δηλώνουν το κάθε γραμμα(π.χ. σε unicode/ascii) και μετά να τα ξανά φέρνουμε σε κανονική μορφή. Ναι, κάπως έτσι αλλά όχι τόσο απλά. Αν σε ενδιαφέρει ο τομέας compression-algorithms, μπορείς φαντάζομαι να ξεκινήσεις διαβάζοντας για το Huffman Coding στην Wikipedia.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα