Newsgroup: it.comp.lang.c
Titolo: Da bit a bit... come?

 'The Krazy One'   ::--------
->  "To reign is worth ambition, though in hell."   |  UIN: 21267457  <-
-<  "Better to Reign in Hell Than Serve in Heaven"  | ircnet: krazy98 >-
---** Whoa! Error finding error not found error. **---

bit 11?
Per i bit da 0 a 3 puoi usare la formula 
valore = intero & 0x0F ;
per i bit da 8 a 11 invece :
valore = (intero >> 8) & 0x0F ;
In generale, se vuoi ottenere il valore della sequenza di bit compresa
tra bit1 e bit2 puoi utilizzare una macro del genere :
#include <math.h>
#define BITSEQ(bit1, bit2) ( (intero >> bit1) & 
                             (unsigned)ldexp(1.0, bit2 - bit1 + 1 ) ) 
Testala, pero', perche' non l'ho provata...

 wrote in message
377390da...@diesel.cu.mi.it...

Posso proporre anche la mia idea?
#define testbit( v,f,e )    (((v)&((1L<<((e)+1))-1))>>(f))
dove:
  'v' e' i valore da testare
  'f' e' il bit di inizio (0 e' il primo bit)
  'e' e' il bit finale (max 7 per v==char, 15 per v==int, 31 per v==long)
non si puo' usare con i floating point.
il risultato e' sempre shiftato nei bit meno significativi, cioe' nel caso
di:
  int  a=0x78;
  int  b=testbit( a,3,4 );
ottengo in b=3;
Per non avere l'estensione del segno testando il bit piu' significativo e'
necessarioo che 'v' sia di tipo unsigned xxx.
ciao
donCiccio

>  'e' e' il bit finale (max 7 per v==char, 15 per v==int, 31 per v==long)
...non e' detto, comunque, che i valori massimi siano effettivamente
tali...

bit 11?
Basta cambiare la maschera. In questo caso 00001111-00000000b = 0F00h.
Però in questo caso se vuoi il vero risultato devi fare uno shift al
risultato finale di 8 bit verso destra.
Esempio:
int valore = 0x3A89;
int maschera = 0x0F00;
int risultato = valore & maschera;
ora risultato = 0x0A00;
per avere il vero numero fai uno shift a destra di 8 bit
risultato = risultato >> 8;
hai ottenuto il numero cercato: risultato = 0x000A
Ciao, Giuseppe

 



Acch..., ci casco sempre. Hai ragione. Non riesco mai a liberarmi dal modo
DOS 16bit.
ciao
donCiccio

 wrote:
[ snip ]
PF>Ho sempre un integer a 16 bit. Come faccio per esempio, a estrarre dal
PF>bit 0 al bit 3 (inclusi) e mettere quello che esce in un altro int o in
PF>un char [o altro tipo]? E se per esempio dovessi estrarre dal bit 8 al
PF>bit 11?
Per esempio:
-----------------------------------------------------------------------
#include <stdio.h>
unsigned int maskbit(unsigned num, int from, int to)
{
        return (num >> from) & (~(~0 << (to - from + 1)));
}
int main()
{
        unsigned int num = 0x3AF8;
        printf("0x%04X\n0x%04X\n", maskbit(num, 0, 3),
               maskbit(num, 8, 11));
        return 0;
}
-----------------------------------------------------------------------
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

         printf("0x%04X\n0x%04X\n", maskbit(num, 0, 3), maskbit(num, 8, 11));
	Puoi anche scrivere:
          printf("%#06X\n%#06X\n", maskbit(num, 0, 3), maskbit(num, 8,
11));
no?
	Ciao,
		Massimo

>                maskbit(num, 8, 11));
MC>	Puoi anche scrivere:
MC>          printf("%#06X\n%#06X\n", maskbit(num, 0, 3), 
MC>                  maskbit(num, 8, 11));
MC>no?
No ;)
Se scrivo come da te suggerito, ottengo qualcosa tipo
    0X0008
    0X000A
mentre quello che voglio io e'
    0x0008
    0x000A
In altre parole '0x' deve avere la 'x' minuscola, ma contemporaneamente
gli eventuali valori A-F del numero devono essere maiuscoli.
