migf1 Δημοσ. 30 Σεπτεμβρίου 2012 Δημοσ. 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 Μέλος Δημοσ. 1 Οκτωβρίου 2012 Thanks για την απάντηση, αλλά πως με βοηθάει το xor σε αυτή την περίπτωση; Πως θα γίνει ο κώδικας της byte_set_hiNibble() με το xor?
imitheos Δημοσ. 1 Οκτωβρίου 2012 Δημοσ. 1 Οκτωβρίου 2012 > void byte_set_hiNibble( Byte *byte, Byte hiNibble ) { *byte |= hiNibble << 4; } Έτσι σε βολεύει ? 2
migf1 Δημοσ. 1 Οκτωβρίου 2012 Μέλος Δημοσ. 1 Οκτωβρίου 2012 Είσαι Θεός ρε (και ουχί ημίθεος! ) Να ξερες πόση ώρα παιδεύομαι!!!! Στο τέλος άρχια να ψάχνω παλιούς μου κώδικες που είμαι σίγουρος πως το είχα, αλλα δεν το βρισκα. Πολλά thanks!
παπι Δημοσ. 1 Οκτωβρίου 2012 Δημοσ. 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 Μέλος Δημοσ. 1 Οκτωβρίου 2012 Και το make() του πάπι πολύ ωραίο (και τώρα που το έγραψε, θυμάμαι κάπου το έχω ξαναδει/ξαναχρησιμοποιήσει... στο WIN32 API νομίζω; για WORDs?
παπι Δημοσ. 1 Οκτωβρίου 2012 Δημοσ. 1 Οκτωβρίου 2012 ναι Τωρα που το βλεπω ετσι ειναι πιο ωραιο > #define setl(b,l) make(l,hi() #define seth(b,h) make(lo(,h) το cap b ειναι bug τους site
migf1 Δημοσ. 1 Οκτωβρίου 2012 Μέλος Δημοσ. 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 Δημοσ. 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 Δημοσ. 1 Οκτωβρίου 2012 Καλως τον, καιρο εχουμε να σε δουμε σε αυτα τα λημερια
migf1 Δημοσ. 1 Οκτωβρίου 2012 Μέλος Δημοσ. 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 Δημοσ. 1 Οκτωβρίου 2012 Καλως τον, καιρο εχουμε να σε δουμε σε αυτα τα λημερια Είμαι σκουριασμένος και ντρέπομαι να ποστάρω!
παπι Δημοσ. 1 Οκτωβρίου 2012 Δημοσ. 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 Μέλος Δημοσ. 1 Οκτωβρίου 2012 Μπα. μ@λ@κια έγραψα... άμα είναι να σβήνουμε το low nibble δεν έχει νόημα. Οπότε δεν πάει έτσι η σειρά του statement. Δεν την παλέυω άλλο σήμερα, μου κανε ένα κεφάλι καζάνι πάλι.
παπι Δημοσ. 1 Οκτωβρίου 2012 Δημοσ. 1 Οκτωβρίου 2012 Ελα μωρε τωρα, εδω σκαλωσες; εχεις μια μεταβλητη hiNibble η οποια ειναι lowNibble. Εχεις το byte που θες να σεταρεις το hi Αρα byte = (byte & 0xf) <-- clear hi | <--- add (hiNibble << 4) <-- make it hi 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα