Newsgroup: it.comp.lang.c
Titolo: Operatori x unsigned short

Salve ragazzi, ho un piccolo problema. Premetto che non conosco il C alla
perfezione (altrimenti non
chiederei il vostro aiuto :) ).
Ho una variabile di tipo unsigned short (16 bit credo...). Secondo
specifiche in tale variabile č contenuta una data, ove:
nei primi  8 bit vi sono le due cifre dell' anno, nei 4 bit sucessivi il
mese, e negli ultimi 4 bit il giorno.
graficamente penso che si possa rappresentare pressapoco cosě:
/************************************************************************/
0                                    8                12                16
<=     numero bit
|                                     ||                  ||
|    |    |    |    |    |    |    |    ||    |    |    |    ||    |    |
|    |     <=     variabile unsigned short a 16 bit.
      anno (2 cifre)                  mese           giorno
< --------------------- >< --------- >< --------- >
            8 bit                          4 bit            4 bit
            1° byte                            2° byte
< --------------------- >< ----------------------- >
/************************************************************************/
Il mio problema č tradurre in una stringa tale data. So che dovrň usare gli
operatori bit, tipo & e >>, ma
non avendoli mai usati mi farebbe piacere vedere 2 righe di codice di
qualcuno che abbia gia'
effettuato tale operazione.
Grazie a tutti quelli che mi daranno una mano.
Simone :))

mese, e negli ultimi 4 bit il giorno.
Mi sembra strano.
4 bit non bastano per rappresentare il giorno (4 bit = 16
valori, da 0 a 15).

Mettiamo che a te interessino i bit  2, 3 e 4 di un char (supposto 8
bit, per scoprire la reale dimensione basta leggere la macro
CHAR_BIT), quindi:
posizione: 0 1 2 3 4 5 6 7
bit:       1 1 1 0 1 0 0 1 (esempio)
Per estrarre i bit ci sono vari modi, se conosci un po' di logica
binaria li trovi da solo... io ti fornisco quello con l'AND che, se
non mi sbaglio, e' quello piu' diretto.
Ti crei una maschera con un 1 in corrispondenza dei bit 2, 3 e 4,
quindi:
posizione: 0 1 2 3 4 5 6 7
maschera:  0 0 1 1 1 0 0 0 (in hex 38)
Poi metti in and il tuo char con la maschera:
<code>
bit & maschera;
</code>
posizione: 0 1 2 3 4 5 6 7
bit:       1 1 1 0 1 0 0 1
maschera:  0 0 1 1 1 0 0 0
ris_and:   0 0 1 0 1 0 0 0
Cosi' hai azzerato tutti i bit non significativi (0, 1, 5, 6, 7). Se
tu volessi solo vedere se almeno uno e' settato puoi gia' farlo... se
invece vuoi assegnarli a una variabile probabilmente vorrai shiftarli
a sinistra per farli combaciare con l'inizio della variabile.
Mettiamo che tu voglia assegnare il risultato dell'AND a un'altro
char:
<code>
char variabile_ris = (bit & maschera) >> 3;
</code>
posizione: 0 1 2 3 4 5 6 7
ris_and:   0 0 1 0 1 0 0 0 (risultato and)
ris_sh:    0 0 0 0 0 1 0 1 (risultato shift)
Se devi assegnare tipi diversi tra di loro devi usare un cast al tipo
della variabile a cui assegni il risultato.
Mox

bit:       1 1 1 0 1 0 0 1 (esempio)
Solo un appunto per dire che la numerazione dei bit,
normalmente, e' inversa:
posizione: 7 6 5 4 3 2 1 0


 Mox
ti ringrazio ancora, e spero tu possa darmi anche quest'ultimo chiarimento.