18.08.2013 Views

Dalla A alla Z passando per C - Robotica

Dalla A alla Z passando per C - Robotica

Dalla A alla Z passando per C - Robotica

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!