Dalla A alla Z passando per C - Robotica
Dalla A alla Z passando per C - Robotica
Dalla A alla Z passando per C - Robotica
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
c1 = c >> 1; /* 01101000 */<br />
c1 = c >> 3; /* 00011010 */<br />
c1 = c >> 7; /* 00000001 */<br />
Si noti che lo shift equivale ad una moltiplicazione o divisione <strong>per</strong> due, a seconda che si tratti di<br />
shift a sinistra o a destra.<br />
Un esempio un pò più complesso è il seguente, il quale effettua la conversione da di un pixel<br />
d<strong>alla</strong> codifica rgb888 a rgb565.<br />
unsigned char rgb[3];<br />
unsigned short pixel;<br />
pixel = ((rgb[0] >> 3) > 2) > 3);<br />
La codifica RGB 1 utilizza un certo numero di bit <strong>per</strong> memorizzare le rispettive componenti di<br />
colore. La codifica rgb888 utilizza 8 bit <strong>per</strong> ciascun colore, mentre la codifica rgb565 utilizza<br />
5 bit <strong>per</strong> il rosso, 6 bit <strong>per</strong> il verde e 5 bit <strong>per</strong> il blu. Per questo il pixel codificato in rgb888<br />
è memorizzato in un array di 3 caratteri (unsigned char rgb[3]), mentre il pixel codificato in<br />
rgb565 viene memorizzato nello short pixel di 2 soli byte.<br />
Dopo la conversione, bisogna fare attenzione a come si salva pixel (16 bit) su macchine bigendian/little-endian<br />
. Big-endian e little-endian sono due metodi alternativi <strong>per</strong> memorizzare<br />
valori numerici che richiedono più di 8 bit. La differenza consiste nell’ordine con il quale i byte<br />
sono memorizzati:<br />
• big-endian è la memorizzazione che inizia dal byte più significativo <strong>per</strong> finire col meno<br />
significativo<br />
• little-endian è la memorizzazione che inizia dal byte meno significativo <strong>per</strong> finire col più<br />
significativo<br />
Per esempio, il valore esadecimale a 32 bit 0x12345678 (0x01 è il byte più significativo)<br />
viene memorizzato come 0x67|0x45|0x23|0x01 su macchine little-endian e 0x01|0x23|0x45|0x67<br />
su macchine big-endian.<br />
La differenza non riguarda la posizione dei bit all’interno del byte – in questo caso si parla di<br />
ordine dei bit – né la posizione dei caratteri in una stringa.<br />
1 Red–Green–Blue, ovvero Rosso–Verde–Blu.<br />
66