Un piccolo aiuto...

Salve a tutti. Mentre giravo su internet in cerca di informazioni riguardo il nunchuck wii e il suo collegamento con arduino, ho trovato in diversi codici queste righe:

 if ((nunchuck_buf[5] >> 2) & 1)
    accel_x_axis += 2;
  if ((nunchuck_buf[5] >> 3) & 1)
    accel_x_axis += 1;

  if ((nunchuck_buf[5] >> 4) & 1)
    accel_y_axis += 2;
  if ((nunchuck_buf[5] >> 5) & 1)
    accel_y_axis += 1;

  if ((nunchuck_buf[5] >> 6) & 1)
    accel_z_axis += 2;
  if ((nunchuck_buf[5] >> 7) & 1)
    accel_z_axis += 1;

nelle quali nunchuk_buf[5] è il quinto byte ricevuto dal nunchuck che contiene le informazioni sulla pressione dei pulsanti e i lsb dei 3 accelerometri. Ciò che vorrei capire è come funziona questo codice, o meglio quando viene verificata la condizione all'interno dell'if, dato che non riesco a riconoscere nessuna operazione di comparazione! Ciò che c'è dentro la condizione non è altro che uno shift dei bit e la somma con uno no?

Grazie, pierpaolo.

Non esattamente. Parto da un presupposto, non conosco come opera la lib. In nuncuck_buf[5] hai detto che ci sono i tasti premuti. Immagino quindi che ogni bit rappresenta un tasto.

Quindi quella serie di if sono uno scorrimento a destra di un numero prefissato di bit ed un test AND con 1 per verificare che il bit in questione sia 1 o 0, ossia il relativo tasto sia stato premuto oppure no.

Prendiamo il primo caso:

if ((nunchuck_buf[5] >> 2) & 1)

Il contenuto del buffer viene fatto scorrere di 2 bit a destra, il che equivale a dire che il prossimo bit da testare sarà appunto il 3. Questo perché se tu hai 00000100, con uno scorrimento di 2 posizioni a destra, alla fine hai 00000001. A questo punto capisci che il test ha il suo significato: l'AND è un confronto bit a bit, quindi è come se io confrontassi 00000001 con 00000001. Se quindi entrambi i bit sono a 1, il test darà vero.

Gli altri sono a seguire. Con

if ((nunchuck_buf[5] >> 3) & 1)

fai lo stesso ragionamento ma operando sul 4° bit ecc...

Ciao, l'operatore & non è la somma con uno ma il confronto AND tra i bit. Ad esempio confrontando 101110 (46 in decimale) con 110101(53 in decimale) otterresti:

101110 &

110101 =

100100

Ciao

[Edit] Quando ho iniziato Leo non aveva ancora postato, la sua risposta è sicuramente più aopprofondita della mia. [/Edit]

leo72: Non esattamente. Parto da un presupposto, non conosco come opera la lib. In nuncuck_buf[5] hai detto che ci sono i tasti premuti. Immagino quindi che ogni bit rappresenta un tasto.

Quindi quella serie di if sono uno scorrimento a destra di un numero prefissato di bit ed un test AND con 1 per verificare che il bit in questione sia 1 o 0, ossia il relativo tasto sia stato premuto oppure no.

Prendiamo il primo caso:

if ((nunchuck_buf[5] >> 2) & 1)

Il contenuto del buffer viene fatto scorrere di 2 bit a destra, il che equivale a dire che il prossimo bit da testare sarà appunto il 3. Questo perché se tu hai 00000100, con uno scorrimento di 2 posizioni a destra, alla fine hai 00000001. A questo punto capisci che il test ha il suo significato: l'AND è un confronto bit a bit, quindi è come se io confrontassi 00000001 con 00000001. Se quindi entrambi i bit sono a 1, il test darà vero.

Gli altri sono a seguire. Con

if ((nunchuck_buf[5] >> 3) & 1)

fai lo stesso ragionamento ma operando sul 4° bit ecc...

Ecco, adesso è un pò più chiaro. Leggendo nel language reference avevo immaginato funzionasse così, però ero, e sono tutt'ora al palo sull'attivazione o meno dell'if. Mi spiego, non dovremmo mettere all'interno della condizione un confronto con un byte di riferimento, di modo che il risultato dell'and sia verificato? In altre parole, nell'esempio che hai fatto tu il risultato saranno 8 bit, 00000001 mentre in un altro caso il risultato potrebbe essere 0000000. Il costrutto if in automatico sa se eseguire l'istruzione se il risultato è 1 o passare avanti se il risultato è 0?

Ciao, esattamente come hai detto tu... per il c un valore zero è false e uno è true quindi l'if viene valutato correttamente.

Ciao

Esattamente come ha detto fabpolli.

L'if si può usare anche implicitamente:

if (condizione)

equivale a

if (condizione==true)

come

if (!condizione)

equivale a

if (condizione==false)

oppure

if (condizione!=true)

Quindi

if ((nunchuck_buf[5] >> 2) & 1)

equivale a

if (((nunchuck_buf[5] >> 2) & 1) == true)

Perfetto vi ringrazio infinitamente, mi stavo rompendo la testa!! Comunque questo fatto dell'if penso che sia il caso di inserirlo nel reference no?

Ciao, a mio modestissimo parere no, se non sbaglio nel reference ci sono i comandi legati ad arduino/wiring la questione dell'if invece è una specifica del linguaggio c/c++ a questo punto se si va ad inserire questa cosa nel reference alla fine ci si troverebbe a dover mettere l'intero manuale del c... cosa che creerebbe non poca confusione.

Ciao