bxenos Δημοσ. 18 Οκτωβρίου 2009 Δημοσ. 18 Οκτωβρίου 2009 έστω ένας αριθμός στο δυαδικό σύστημα με 16 ψηφεία: 'abcdefghijklmnop' όπου 'a' είναι το πιο σημαντικό και 'p' το λιγότερο σημαντικό: Τα 'abcdefghijklm' δείχνουν τη θέση του bit στον πίνακα header και τα 'nop' τη θέση του bit μέσα στο byte header['abcdefghijklm']. Αυτό συμβαίνει διότι απαιτούνται 3 bit για την αναπαράσταση αριθμών απο το 0 εως το 7 (τα bit που περιλαμβάνει ενα byte), αρα τα υπόλοιπα bit είναι δείκτης για το byte. το bitfield που δήλωσες σε πίνακα 8 char δεν δουλεύει. Υπάρχουν πολλοί συνδιασμοί να κάνεις αυτό που θές και μερικοί απο αυτούς έχουν αναφερθεί. Αλλος ένας (low level, high efficient) είναι: > int BitValue(unsigned char *header,unsigned position){ return header[position>>3] & (1 << (position & 7)); } η επιλογή byte γίνεται εδω: header[position>>3] επιλογή bit γίνεται εδώ :1 << (position & 7)
pagratios Δημοσ. 18 Οκτωβρίου 2009 Μέλος Δημοσ. 18 Οκτωβρίου 2009 Αφού το κάθε block είναι 1024 byte και το κάθε byte έχει 8 bit άρα αυτό που έκανα είναι ένας πίνακας με 8 βιτ
bxenos Δημοσ. 18 Οκτωβρίου 2009 Δημοσ. 18 Οκτωβρίου 2009 έκανες ένα πίνακα με 8 "ακεραίους". Δηλαδή εξαρτάτε απο τον compiler αν είναι πίνακας με 8 char ή με 8 int. Δεν υπάρχει πίνακας με bit
pagratios Δημοσ. 18 Οκτωβρίου 2009 Μέλος Δημοσ. 18 Οκτωβρίου 2009 ναι αλλά έκανα μία δομή με έναν ακέραιο ενός bit και την δομή έκανα πίνακα
Evgenios1 Δημοσ. 18 Οκτωβρίου 2009 Δημοσ. 18 Οκτωβρίου 2009 ναι αλλά έκανα μία δομή με έναν ακέραιο ενός bit και την δομή έκανα πίνακα 32 βιτ ειναι. απλος βλεπεις το πρωτο (ή το τελευτεο, νομιζω εξαρτατε απο το συστημα)
TheMagician Δημοσ. 18 Οκτωβρίου 2009 Δημοσ. 18 Οκτωβρίου 2009 ναι αλλά έκανα μία δομή με έναν ακέραιο ενός bit και την δομή έκανα πίνακα σε καμια περιπτωση στη C/C++ οι structs πιανουν χωρο πολλαπλασιο του 4, το κανουν ετσι οι compilers για λογους βελτιστοποιησης Φυσικα μπορεις να πεις στον compiler να μη το κανει αυτο αλλα μετα θα πιανει απλα ενα byte Και char a:1; να πεις παλι 1 byte μνημη θα το παρει απλα αν εχεις πολλα τετοια θα τα βαλει στο ιδιο byte Γενικα αποδεξου οτι ΔΕΝ μπορεις να εχεις array απο bits και κατσε να κανεις την εργασια σου σωστα...
pagratios Δημοσ. 18 Οκτωβρίου 2009 Μέλος Δημοσ. 18 Οκτωβρίου 2009 Σας πιστεύω απλά σε κάτι διαφανειες ενός καθηγητή έλεγε κάτι τέτοια να τι έλεγε • ́Αλλος τρόπος για οικονομία μνήμης είναι τα πεδία bit. Ορίζοντας μία δομή, μπορούμε να δηλώσουμε μέλη τύπου ακεραίου, αλλά με συγκεκριμένο πλήθος bits το καθένα. • Παράδειγμα: struct { unsigned int mode : 2; unsigned int bool : 1; unsigned int octal : 3; } flags;
bxenos Δημοσ. 19 Οκτωβρίου 2009 Δημοσ. 19 Οκτωβρίου 2009 σωστα το είπε ο καθηγητης σου. Την περίπτωση αυτή την έχει αναφερει και ο TheMagician. Και καθότι το ζαλίζεις αρκετα το θέμα χωρίς λόγο, δοκίμαζε το μέγεθος των δεδομένων σου με το sizeof και δες πόσο χώρο πιάνουν στη μνήμη. αν θέλεις να έχεις τα 8 bit (αλλα δεν είναι bit array) κάνε το εξης (που δεν βολεύει ΚΑΘΟΛΟΥ στην περίπτωση σου) > struct { unsigned char b0:1; unsigned char b1:1; unsigned char b2:1; unsigned char b3:1; unsigned char b4:1; unsigned char b5:1; unsigned char b6:1; unsigned char b7:1; } bits; Το παραπάνω θα βρείς να έχει μέγεθος 1 byte στην περίπτωση σου. Αλλα δεν σε βολεύει ΚΑΘΟΛΟΥ για το πρόβλημα σου και ΔΕΝ ειναι bit array Στο παραπάνω δεν υπάρχει δέσμευση για το ποιό είναι το LSB ή το MSB (είναι θέμα επεξεργαστή/compiler).
pagratios Δημοσ. 19 Οκτωβρίου 2009 Μέλος Δημοσ. 19 Οκτωβρίου 2009 Τελικα το έφτιασα με τον τρόπο στο ποστ 13!Ευχαριστο για την βοήθεια σας!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.