migf1 Δημοσ. 30 Σεπτεμβρίου 2012 Share Δημοσ. 30 Σεπτεμβρίου 2012 Μου 'χει σπάσει τα νεύρα!!!! Το έχω κάνει μεν, αλλά ψάχνω εδώ και πάνω από μια ώρα να το κάνω πιο απλά για να κερδίσω speed και δεν μπορώ με τίποτα Λοιπόν βασικά θέλω να αποθηκεύσω 2 αριθμούς μικρότερους του 16 (δλδ έως και 0xF) τον καθένα σε ένα nibble ενός byte. Με το low-nibble δεν έχω θέμα, αλλά με το hi-nibble έχω (για όσους δεν είναι εξοικειωμένοι με την ορολογία, ένα nibble είναι μισό byte,δηλαδή 4 bits). Για παράδειγμα, αν έχω 2 νούμερα π.χ. 10 και 4 θέλω να βάλω το 10 στο low nibble και το 4 στο high nibble. Αυτό το τελευταίο είναι που με παιδεύει... > #include <stdint.h> ... /* get low & high nibbles of an unsigned byte */ #define LO_NIBBLE(u8) ( (uint8_t)((u8) & 0x0F) ) #define HI_NIBBLE(u8) ( (uint8_t)((u8) >> 4) ) ... /*********************************************************//** * ************************************************************* */ void byte_set_hiNibble( Byte *byte, Byte hiNibble ) { Byte lonibble = LO_NIBBLE(*byte); // save low nibble *byte = hiNibble; // set hiNibble as low nibble *byte <<= 4; // move low nibble to high nibble *byte |= lonibble; // set the original (saved) low nibble } /*********************************************************//** * ************************************************************* */ int main( void ) { Byte byte = 10; printf( "Byte: %02X (%d), High nibble: %X (%d), Low nibble: %X (%d)\n", byte,byte, HI_NIBBLE(byte),HI_NIBBLE(byte), LO_NIBBLE(byte),LO_NIBBLE(byte) ); byte_set_hiNibble( &byte, 4 ); printf( "Byte: %02X (%d), High nibble: %X (%d), Low nibble: %X (%d)\n", byte,byte, HI_NIBBLE(byte),HI_NIBBLE(byte), LO_NIBBLE(byte),LO_NIBBLE(byte) ); pressENTER(); exit( EXIT_SUCCESS ); } Δουλεύει, αλλα η byte_set_hiNibble() δεν είναι over-complicated; Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
migf1 Δημοσ. 1 Οκτωβρίου 2012 Μέλος Share Δημοσ. 1 Οκτωβρίου 2012 Thanks για την απάντηση, αλλά πως με βοηθάει το xor σε αυτή την περίπτωση; Πως θα γίνει ο κώδικας της byte_set_hiNibble() με το xor? Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
imitheos Δημοσ. 1 Οκτωβρίου 2012 Share Δημοσ. 1 Οκτωβρίου 2012 > void byte_set_hiNibble( Byte *byte, Byte hiNibble ) { *byte |= hiNibble << 4; } Έτσι σε βολεύει ? 2 Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
migf1 Δημοσ. 1 Οκτωβρίου 2012 Μέλος Share Δημοσ. 1 Οκτωβρίου 2012 Είσαι Θεός ρε (και ουχί ημίθεος! ) Να ξερες πόση ώρα παιδεύομαι!!!! Στο τέλος άρχια να ψάχνω παλιούς μου κώδικες που είμαι σίγουρος πως το είχα, αλλα δεν το βρισκα. Πολλά thanks! Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
παπι Δημοσ. 1 Οκτωβρίου 2012 Share Δημοσ. 1 Οκτωβρίου 2012 > #define hi( (b >> 4 ) #define lo( (b & 0xf) #define make(l,h) ( (h << 4) | (l & 0xf)) #define setl(b,l) ( (hi( << 4) | (l & 0xf)) #define seth(b,h) ( lo( | (h<<4)) int main(int argc, char **argv) { char b = make(4,3); char h = hi(; char l = lo(; b = setl(b,1); b = seth(b,1); l = lo(; h = hi(; return 0; } edit Α καλα... Μεχρι να το γραψω βγηκαν 343242342 μηνυματα 1 Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
migf1 Δημοσ. 1 Οκτωβρίου 2012 Μέλος Share Δημοσ. 1 Οκτωβρίου 2012 Και το make() του πάπι πολύ ωραίο (και τώρα που το έγραψε, θυμάμαι κάπου το έχω ξαναδει/ξαναχρησιμοποιήσει... στο WIN32 API νομίζω; για WORDs? Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
παπι Δημοσ. 1 Οκτωβρίου 2012 Share Δημοσ. 1 Οκτωβρίου 2012 ναι Τωρα που το βλεπω ετσι ειναι πιο ωραιο > #define setl(b,l) make(l,hi() #define seth(b,h) make(lo(,h) το cap b ειναι bug τους site Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
migf1 Δημοσ. 1 Οκτωβρίου 2012 Μέλος Share Δημοσ. 1 Οκτωβρίου 2012 Ναι έχει bug το φόρουμ με τα a,b... πάντως τα set δεν βλέπω να χρειάζονται (ως macros τουλάχιστον). Τα αντικαθιστά πολύ καλύτερα το MAKE(). Btw, για να το σιγουρέψω μιας και σας βρήκα σε οίστρο (σε αντίθεση με μένα) η συνάρτηση για το set_lo_nibble() πάει έτσι ε; > void byte_set_loNibble( Byte *byte, Byte loNibble ) { *byte = (*byte & 0xF0) | loNibble; } 1 Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
parsifal Δημοσ. 1 Οκτωβρίου 2012 Share Δημοσ. 1 Οκτωβρίου 2012 > void byte_set_hiNibble( Byte *byte, Byte hiNibble ) { *byte |= hiNibble << 4; } Έτσι σε βολεύει ? Αν υπάρχουν αδέσποτοι «άσσοι» στο high nibble από προηγούμενη χρήση, θα τον δαγκώσουν στα πισινά. Πρέπει να τους «καθαρίσεις»: > void byte_set_hiNibble(Byte *byte, Byte hiNibble) { *byte &= 0x0F; /* Clear only high nibble bits of variable byte */ *byte |= hiNibble << 4 /* Set only high nibble bits of variable byte */ } 1 Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
παπι Δημοσ. 1 Οκτωβρίου 2012 Share Δημοσ. 1 Οκτωβρίου 2012 Καλως τον, καιρο εχουμε να σε δουμε σε αυτα τα λημερια Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
migf1 Δημοσ. 1 Οκτωβρίου 2012 Μέλος Share Δημοσ. 1 Οκτωβρίου 2012 Αν υπάρχουν αδέσποτοι «άσσοι» στο high nibble από προηγούμενη χρήση, θα τον δαγκώσουν στα πισινά. Πρέπει να τους «καθαρίσεις»: > void byte_set_hiNibble(Byte *byte, Byte hiNibble) { *byte &= 0x0F; /* Clear only high nibble bits of variable byte */ *byte |= hiNibble << 4 /* Set only high nibble bits of variable byte */ } Βασικά εφόσον γίνεται shift δεν χρειάζεται να καθαριστεί το high-nibble. Μάλλον όμως πρέπει να καθαρίστεί το low nibble προτού γίνει πάνω του | το hiNibble (για να γίνει μετά shifted αριστερά). Έτσι δεν πάει η σειρά αυτού του statement? Γίνεται δηλαδή πρώτα | το hiNibble στο low nibble του byte, και μετά γίνεται shifted αριστερά. Αν ναι, τότε πρέπει να γίνει κάπως έτσι... > void byte_set_hiNibble(Byte *byte, Byte hiNibble) { *byte = (*byte & 0xF0 ) | hiNibble << 4; } Διορθώστε αν κάνω λάθος. Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
parsifal Δημοσ. 1 Οκτωβρίου 2012 Share Δημοσ. 1 Οκτωβρίου 2012 Καλως τον, καιρο εχουμε να σε δουμε σε αυτα τα λημερια Είμαι σκουριασμένος και ντρέπομαι να ποστάρω! Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
παπι Δημοσ. 1 Οκτωβρίου 2012 Share Δημοσ. 1 Οκτωβρίου 2012 Βασικά εφόσον γίνεται shift δεν χρειάζεται να καθαριστεί το high-nibble. Μάλλον όμως πρέπει να καθαρίστεί το low nibble προτού γίνει πάνω του | το hiNibble (για να γίνει μετά shifted αριστερά). Έτσι δεν πάει η σειρά αυτού του statement? Γίνεται δηλαδή πρώτα | το hiNibble στο low nibble του byte, και μετά γίνεται shifted αριστερά. Αν ναι, τότε πρέπει να γίνει κάπως έτσι... > void byte_set_hiNibble(Byte *byte, Byte hiNibble) { *byte = (*byte & 0xF0 ) | hiNibble << 4; } Διορθώστε αν κάνω λάθος. Ελα απο αριστερα προς τα δεξια. Βαλε σε παρενθεσεις το σιφτιν αλλιως θα κανεις σιφτ στο αποτελεσμα Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
migf1 Δημοσ. 1 Οκτωβρίου 2012 Μέλος Share Δημοσ. 1 Οκτωβρίου 2012 Μπα. μ@λ@κια έγραψα... άμα είναι να σβήνουμε το low nibble δεν έχει νόημα. Οπότε δεν πάει έτσι η σειρά του statement. Δεν την παλέυω άλλο σήμερα, μου κανε ένα κεφάλι καζάνι πάλι. Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
παπι Δημοσ. 1 Οκτωβρίου 2012 Share Δημοσ. 1 Οκτωβρίου 2012 Ελα μωρε τωρα, εδω σκαλωσες; εχεις μια μεταβλητη hiNibble η οποια ειναι lowNibble. Εχεις το byte που θες να σεταρεις το hi Αρα byte = (byte & 0xf) <-- clear hi | <--- add (hiNibble << 4) <-- make it hi 1 Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα