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

Πως σετάρουμε το high nibble ενός byte;


migf1

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

Μου 'χει σπάσει τα νεύρα!!!!

 

Το έχω κάνει μεν, αλλά ψάχνω εδώ και πάνω από μια ώρα να το κάνω πιο απλά για να κερδίσω 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;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 106
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Είσαι Θεός ρε (και ουχί ημίθεος! :) )

 

Να ξερες πόση ώρα παιδεύομαι!!!! Στο τέλος άρχια να ψάχνω παλιούς μου κώδικες που είμαι σίγουρος πως το είχα, αλλα δεν το βρισκα.

 

Πολλά thanks!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

>
#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 μηνυματα

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι έχει bug το φόρουμ με τα a,b... πάντως τα set δεν βλέπω να χρειάζονται (ως macros τουλάχιστον). Τα αντικαθιστά πολύ καλύτερα το MAKE().

 

Btw, για να το σιγουρέψω μιας και σας βρήκα σε οίστρο (σε αντίθεση με μένα) η συνάρτηση για το set_lo_nibble() πάει έτσι ε;

 

>
void byte_set_loNibble( Byte *byte, Byte loNibble )
{
*byte = (*byte & 0xF0) | loNibble;
}

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

>
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 */
}

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

 

Αν υπάρχουν αδέσποτοι «άσσοι» στο 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;
}

 

Διορθώστε αν κάνω λάθος.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Βασικά εφόσον γίνεται 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;
}

 

Διορθώστε αν κάνω λάθος.

 

Ελα απο αριστερα προς τα δεξια. Βαλε σε παρενθεσεις το σιφτιν αλλιως θα κανεις σιφτ στο αποτελεσμα

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μπα. μ@λ@κια έγραψα... άμα είναι να σβήνουμε το low nibble δεν έχει νόημα. Οπότε δεν πάει έτσι η σειρά του statement. Δεν την παλέυω άλλο σήμερα, μου κανε ένα κεφάλι καζάνι πάλι.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ελα μωρε τωρα, εδω σκαλωσες;

 

εχεις μια μεταβλητη hiNibble η οποια ειναι lowNibble.

Εχεις το byte που θες να σεταρεις το hi

 

Αρα

 

byte = (byte & 0xf) <-- clear hi

| <--- add

(hiNibble << 4) <-- make it hi

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

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