# Bit e shift

**URL:** <https://forum.arduino.cc/t/bit-e-shift/699309>\
**Category:** Generale\
**Created:** [March 8, 2021, 3:18pm UTC](https://forum.arduino.cc/t/bit-e-shift/699309 "2021-03-08T15:18:57Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![gigi\_rbc](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gigi_rbc/32/1098623_2.png) [@gigi\_rbc](https://forum.arduino.cc/u/gigi_rbc)\
**Post date:** [March 8, 2021, 3:18pm UTC](https://forum.arduino.cc/t/bit-e-shift/699309/1 "2021-03-08T15:18:57Z")

</div>

Buongiorno a tutti stò sperimentando un trasmettitore apricancello a 433Mhz e, siccome mi piace complicarmi la vita, vorrei predisporre, nel programma, la sequenza dei bit 0 1 della codifica. Ora la domanda supponiamo di avere una variabile binaria di 12 bit vorrei in quanche modo fare uno shift ed analizzare l'ultimo bit se 0 fare un'operazione e se 1 farne un'altra. Questo mi consentirebbe di modificare la sequenza della codifica direttamente nel programma abbastanza facilmente.  
Grazie a tutti e spero di aver espresso il mio dubbio in maniera comprensiva.

---

<div class="post-metadata">

**Author:** ![Datman](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/datman/32/219519_2.png) [@Datman](https://forum.arduino.cc/u/Datman)\
**Post date:** [March 8, 2021, 3:30pm UTC](https://forum.arduino.cc/t/bit-e-shift/699309/2 "2021-03-08T15:30:48Z")

</div>

Ciao, Luigi  
Per sapere se l'ultimo bit è 0 o 1 basta fare una divisione per 2 e prendere il resto, che è l'LSB. Puoi farlo con una sola operazione, usando l'operatore modulo, %.  
Per esempio: 5%2=1; 6%2=0.

---

<div class="post-metadata">

**Author:** ![gigi\_rbc](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gigi_rbc/32/1098623_2.png) [@gigi\_rbc](https://forum.arduino.cc/u/gigi_rbc)\
**Post date:** [March 8, 2021, 3:37pm UTC](https://forum.arduino.cc/t/bit-e-shift/699309/3 "2021-03-08T15:37:28Z")

</div>

Grazie per la tempestività della risposta però a me serve analizzare tutti i 12 bit della sequenza per esempio se fosse 110010100011 devo fargli fare l'operazione a seconda di ogni bit. avevo pensato di fare un ciclo for usando la formula  
for (int i = 0; i \< 11; i++);  
int bitout = (val1 \>\> i++);

la variabile val1 contiene la codifica.

---

<div class="post-metadata">

**Author:** ![Datman](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/datman/32/219519_2.png) [@Datman](https://forum.arduino.cc/u/Datman)\
**Post date:** [March 8, 2021, 3:51pm UTC](https://forum.arduino.cc/t/bit-e-shift/699309/4 "2021-03-08T15:51:18Z")

</div>

int bitout = (val1 \>\> i);  
Inoltre, devi fare &1 per leggere solo il bit a destra:  
byte bitout=(val1\>\>i)&1;  
&1 è molto più veloce del modulo.

---

<div class="post-metadata">

**Author:** ![gigi\_rbc](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gigi_rbc/32/1098623_2.png) [@gigi\_rbc](https://forum.arduino.cc/u/gigi_rbc)\
**Post date:** [March 8, 2021, 4:08pm UTC](https://forum.arduino.cc/t/bit-e-shift/699309/5 "2021-03-08T16:08:20Z")

</div>

grazie per la risposta  
Altra domandina per dichiarare una variabile binaria uso  
int val1 = '001101001101'

sono giusto?  
avevo pure pensato di utilizzare

Int bitout = val1  
_usando l'array val1[] {0, 1, 0, 1,...}_  
_Scusate ma non sono troppo ferrato col linguaggio di programmazione._

---

<div class="post-metadata">

**Author:** ![Datman](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/datman/32/219519_2.png) [@Datman](https://forum.arduino.cc/u/Datman)\
**Post date:** [March 8, 2021, 4:16pm UTC](https://forum.arduino.cc/t/bit-e-shift/699309/6 "2021-03-08T16:16:26Z")

</div>

Una variabile non è "binaria" o altro. Si distinguono solo per dimensioni e con o senza segno. Se usi la notazione binaria, devi scrivere 0bxxxxxxxx:  
int pippo=0b1101001000100101; // fino a 16 bit  
byte pluto=0b11010010; // fino a 8 bit

---

<div class="post-metadata">

**Author:** ![gigi\_rbc](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gigi_rbc/32/1098623_2.png) [@gigi\_rbc](https://forum.arduino.cc/u/gigi_rbc)\
**Post date:** [March 8, 2021, 4:21pm UTC](https://forum.arduino.cc/t/bit-e-shift/699309/7 "2021-03-08T16:21:51Z")

</div>

Perfetto, grazie, mi perdo in qualche punto basilare secondo te sarebbe meglio usare gli array  
Int bitout = val1  
_usando l'array val1[] {0, 1, 0, 1,...}_  
_o non conviene?_

---

<div class="post-metadata">

**Author:** ![fratt](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/fratt/32/1013044_2.png) [@fratt](https://forum.arduino.cc/u/fratt)\
**Post date:** [March 8, 2021, 5:42pm UTC](https://forum.arduino.cc/t/bit-e-shift/699309/8 "2021-03-08T17:42:42Z")

</div>

Secondo me dipende da cosa vuoi fare con quel numero...  
Se devi solo controllare i singoli bit forse è più intuitivo con un array, però occupa più memoria.  
Se lo devi usare anche come numero intero allora conviene e la variabile singola. Non puoi usare un array come fossero bit di un numero binario e assegnarlo in blocco ad un'altra variabile.

---

<div class="post-metadata">

**Author:** ![maubarzi](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/maubarzi/32/238844_2.png) [@maubarzi](https://forum.arduino.cc/u/maubarzi)\
**Post date:** [March 8, 2021, 5:57pm UTC](https://forum.arduino.cc/t/bit-e-shift/699309/9 "2021-03-08T17:57:43Z")

</div>

Ma perchè non usi variabili int, long, ecc. e poi leggi i singoli bit con [bitRead()](https://www.arduino.cc/reference/en/language/functions/bits-and-bytes/bitread/) ?

Da quel che ho visto stavi appunto provando così, quindi un int ti dovrebbe bastare.  
Solo che, riprendendo il tuo esempio, lo devi inizializzare così:

```cpp
int val1 = B001101001101;

```

cioè con il prefisso B se quel che segue è in notazione binaria, O se ottale e 0x se esadecimale.  
Quindi per inizializzare a 255 fai:

```cpp
int A = 0B11111111; // Lo 0 iniziale dovrebbe essere opzionale.
int B = 0377;
int C = 0xFF;

```

[Qui](https://www.arduino.cc/reference/en/language/variables/constants/integerconstants/) il reference per le inizializzazioni appena descritte.

Se poi devi modificare un bit puoi usare [bitSet()](https://www.arduino.cc/reference/en/language/functions/bits-and-bytes/bitset/) o [bitWrite()](https://www.arduino.cc/reference/en/language/functions/bits-and-bytes/bitwrite/)

Maurizio

---

<div class="post-metadata">

**Author:** ![gigi\_rbc](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gigi_rbc/32/1098623_2.png) [@gigi\_rbc](https://forum.arduino.cc/u/gigi_rbc)\
**Post date:** [March 8, 2021, 6:50pm UTC](https://forum.arduino.cc/t/bit-e-shift/699309/10 "2021-03-08T18:50:49Z")

</div>

ok ci provo  
il codice sarebbe questo

```cpp
int val1 = 0b0101010101010101;
int val2 = 0b0000000000000011;
int val3 = 0b0000000000000010;
int val4 = 0b0000000000000000;

int Uscita = 1;
int Valore = 0;
int i = 0;
int bituot = 0;

void setup() {
  // put your setup code here, to run once:
  pinMode(Uscita, OUTPUT);
}

void loop()
{
  Valore = analogRead(A1);    // effettuo lettura su pin analogico A1 e memorizzo il valore nella variabile valore_letto
  digitalWrite (Uscita, LOW);
  // Pulsante 4
  if (Valore >= 0 && Valore <= 200)
  {
    delayMicroseconds(11520); //Pausa di Reset
    {
      for (int i = 0; i < 11; i++);
      int bitout = (val1 >> i) & 1;
      {
        if (bitout == 0)
        {
          delayMicroseconds(330);
          digitalWrite(Uscita, HIGH);
          delayMicroseconds(660);
          digitalWrite(Uscita, LOW);
        }
        else
        {
          delayMicroseconds(660);
          digitalWrite(Uscita, HIGH);
          delayMicroseconds(330);
          digitalWrite(Uscita, LOW);
        }
      }
    }
  }
}

```

per le graffe non mi da problemi sulla compilazione ma probabilmente sbaglio io qualcosa

---

<div class="post-metadata">

**Author:** ![Datman](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/datman/32/219519_2.png) [@Datman](https://forum.arduino.cc/u/Datman)\
**Post date:** [March 8, 2021, 6:54pm UTC](https://forum.arduino.cc/t/bit-e-shift/699309/11 "2021-03-08T18:54:40Z")

</div>

Con bituot non funzionerà mai... 🙂

---

<div class="post-metadata">

**Author:** ![Datman](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/datman/32/219519_2.png) [@Datman](https://forum.arduino.cc/u/Datman)\
**Post date:** [March 8, 2021, 6:56pm UTC](https://forum.arduino.cc/t/bit-e-shift/699309/12 "2021-03-08T18:56:09Z")

</div>

Inoltre, anche digitalWrite non è una buona scelta per fare temporizzazioni precise.

---

<div class="post-metadata">

**Author:** ![fratt](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/fratt/32/1013044_2.png) [@fratt](https://forum.arduino.cc/u/fratt)\
**Post date:** [March 8, 2021, 6:56pm UTC](https://forum.arduino.cc/t/bit-e-shift/699309/13 "2021-03-08T18:56:55Z")

</div>

Era meglio correggere il primo post...

Il for scritto così non fa nulla (a parte incrementare da 0 a 11 la variabile i).  
Credo che tutto il blocco sotto il for vada dentro il for.

---

<div class="post-metadata">

**Author:** ![Datman](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/datman/32/219519_2.png) [@Datman](https://forum.arduino.cc/u/Datman)\
**Post date:** [March 8, 2021, 6:59pm UTC](https://forum.arduino.cc/t/bit-e-shift/699309/14 "2021-03-08T18:59:27Z")

</div>

Prima di andare avanti, metti il codice del messaggio #9 nei tag!

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [March 8, 2021, 7:09pm UTC](https://forum.arduino.cc/t/bit-e-shift/699309/15 "2021-03-08T19:09:14Z")

</div>

> fratt:  
> Era meglio correggere il primo post...

... visto che **NON** era conforme al regolamento e il OP non lo ha corretto ... l'ho direttamente eliminato, tanto, l'ha riproposto nel post #9.

**\>gigi\_rbc:** ti rammento che, in conformità al [regolamento](http://forum.arduino.cc/index.php?topic=149082.0), punto 7, il codice deve essere **SEMPRE** (_... fosse anche una sola riga_) racchiuso tra i TAG CODE ... mi raccomando per il futuro. Grazie.

Guglielmo

---

<div class="post-metadata">

**Author:** ![gigi\_rbc](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gigi_rbc/32/1098623_2.png) [@gigi\_rbc](https://forum.arduino.cc/u/gigi_rbc)\
**Post date:** [March 8, 2021, 7:56pm UTC](https://forum.arduino.cc/t/bit-e-shift/699309/16 "2021-03-08T19:56:17Z")

</div>

> Datman:  
> Con bituot non funzionerà mai... 🙂

Grazie soluzione?

---

<div class="post-metadata">

**Author:** ![gigi\_rbc](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gigi_rbc/32/1098623_2.png) [@gigi\_rbc](https://forum.arduino.cc/u/gigi_rbc)\
**Post date:** [March 8, 2021, 8:16pm UTC](https://forum.arduino.cc/t/bit-e-shift/699309/17 "2021-03-08T20:16:31Z")

</div>

> Datman:  
> Inoltre, anche digitalWrite non è una buona scelta per fare temporizzazioni precise.

Per fortuna non è tanto necessario avere una temporizzazione precisa. I ricevitori a 433Mhz hanno delle tolleranze abbastanza ampie.

---

<div class="post-metadata">

**Author:** ![fratt](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/fratt/32/1013044_2.png) [@fratt](https://forum.arduino.cc/u/fratt)\
**Post date:** [March 8, 2021, 9:45pm UTC](https://forum.arduino.cc/t/bit-e-shift/699309/18 "2021-03-08T21:45:09Z")

</div>

Riguardo la variabile bitout c'è un doppio errore che si compensa... il secondo annulla il primo...  
Riguardo la digitalWrite, non ne capisco molto di implementazione a basso livello e temporizzazioni, ma anni fa ho fatto un progettino che genera un'onda quadra con digitalWrite e funziona da anni senza problemi.

---

<div class="post-metadata">

**Author:** ![gigi\_rbc](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gigi_rbc/32/1098623_2.png) [@gigi\_rbc](https://forum.arduino.cc/u/gigi_rbc)\
**Post date:** [March 8, 2021, 10:35pm UTC](https://forum.arduino.cc/t/bit-e-shift/699309/19 "2021-03-08T22:35:47Z")

</div>

> fratt:  
> Riguardo la variabile bitout c'è un doppio errore che si compensa... il secondo annulla il primo...  
> Riguardo la digitalWrite, non ne capisco molto di implementazione a basso livello e temporizzazioni, ma anni fa ho fatto un progettino che genera un'onda quadra con digitalWrite e funziona da anni senza problemi.

Ok il digitalWrite serve effettivamente per generare un'onda quadra con caratteristiche specifiche. In metito alla variabile bituot potresti essere un pochino più preciso così per capire l'errore?

---

<div class="post-metadata">

**Author:** ![fratt](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/fratt/32/1013044_2.png) [@fratt](https://forum.arduino.cc/u/fratt)\
**Post date:** [March 8, 2021, 10:46pm UTC](https://forum.arduino.cc/t/bit-e-shift/699309/20 "2021-03-08T22:46:35Z")

</div>

L'hai dichiarata globale all'inizio sbagliando però a scrivere (hai scritto bituot).  
Poi dentro il loop() la dichiari anche locale (se metti il tipo davanti al nome della variabile è una dichiarazione), questa volta scritta giusta.  
O elimini la variabile globale, oppure la scrivi giusta e togli l'int dentro al loop().

In ogni caso, il problema secondo me è nel for (vedi mio post #12).  
Messo così non serve a nulla. Togli il punto e virgola finale e aggiusta le graffe.

[Next page](https://forum.arduino.cc/t/bit-e-shift/699309.md?page=2)
