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

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

Δημοσ.

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

 

Το έχω κάνει μεν, αλλά ψάχνω εδώ και πάνω από μια ώρα να το κάνω πιο απλά για να κερδίσω 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 για την απάντηση, αλλά πως με βοηθάει το xor σε αυτή την περίπτωση; Πως θα γίνει ο κώδικας της byte_set_hiNibble() με το xor?

Δημοσ.

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

 

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

 

Πολλά 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
Δημοσ.

Και το make() του πάπι πολύ ωραίο (και τώρα που το έγραψε, θυμάμαι κάπου το έχω ξαναδει/ξαναχρησιμοποιήσει... στο WIN32 API νομίζω; για WORDs?

Δημοσ.

ναι

 

Τωρα που το βλεπω

ετσι ειναι πιο ωραιο

>
#define setl(b,l)  make(l,hi()
#define seth(b,h)  make(lo(,h)

 

το cap b ειναι bug τους site

Δημοσ.

Ναι έχει 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

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα
  • Δημιουργία νέου...