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

Απορία για μία άσκηση σε C


pagratios

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

Δημοσ.

έστω ένας αριθμός στο δυαδικό σύστημα με 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)

Δημοσ.

έκανες ένα πίνακα με 8 "ακεραίους".

Δηλαδή εξαρτάτε απο τον compiler αν είναι πίνακας με 8 char ή με 8 int.

 

Δεν υπάρχει πίνακας με bit

Δημοσ.
ναι αλλά έκανα μία δομή με έναν ακέραιο ενός bit και την δομή έκανα πίνακα

 

32 βιτ ειναι. απλος βλεπεις το πρωτο (ή το τελευτεο, νομιζω εξαρτατε απο το συστημα)

Δημοσ.
ναι αλλά έκανα μία δομή με έναν ακέραιο ενός bit και την δομή έκανα πίνακα

 

σε καμια περιπτωση

στη C/C++ οι structs πιανουν χωρο πολλαπλασιο του 4, το κανουν ετσι οι compilers για λογους βελτιστοποιησης

Φυσικα μπορεις να πεις στον compiler να μη το κανει αυτο αλλα μετα θα πιανει απλα ενα byte

Και char a:1; να πεις παλι 1 byte μνημη θα το παρει

απλα αν εχεις πολλα τετοια θα τα βαλει στο ιδιο byte

 

Γενικα αποδεξου οτι ΔΕΝ μπορεις να εχεις array απο bits και κατσε να κανεις την εργασια σου σωστα...

Δημοσ.

Σας πιστεύω απλά σε κάτι διαφανειες ενός καθηγητή έλεγε κάτι τέτοια να τι έλεγε

• ́Αλλος τρόπος για οικονομία μνήμης είναι τα πεδία bit.

Ορίζοντας μία δομή, μπορούμε να δηλώσουμε μέλη τύπου

ακεραίου, αλλά με συγκεκριμένο πλήθος bits το καθένα.

• Παράδειγμα:

struct {

unsigned int mode : 2;

unsigned int bool : 1;

unsigned int octal : 3;

} flags;

Δημοσ.

σωστα το είπε ο καθηγητης σου. Την περίπτωση αυτή την έχει αναφερει και ο 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).

Αρχειοθετημένο

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

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