# Copiare i bit di variabili su una variabile

**URL:** <https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751>\
**Category:** Software\
**Created:** [September 18, 2021, 1:58pm UTC](https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751 "2021-09-18T13:58:31Z")\
**Posts on this page:** 19\
**Page:** 2

<div class="post-metadata">

**Author:** ![nid69ita](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/nid69ita/32/901258_2.png) [@nid69ita](https://forum.arduino.cc/u/nid69ita)\
**Post date:** [September 21, 2021, 3:20pm UTC](https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751/22 "2021-09-21T15:20:49Z")

</div>

Sono stato da cliente e non potevo risponderti.  
Se hai una cosa del genere Ciao.pippo(); che esegue del codice e poi deve dare un valore di "ritorno", la strada più ovvia è che pippo() ritorni un valore  
Quindi dentro a pippo dovrai mettere una return(CodeB)  
Quindi if ( Ciao.pippo()==10 ) {  
ma... quel tuo CodeB non ha senso tra le variabili globali del solo .cpp dovebbe essere una variabile locale di pippo() ( **ma tu pippo non posti il codice !!** )

Come detto da altri, altra strada è che CodeB sia variabile interna della classe, meglio se private  
poi, pippo() la scrive e dall'esterno la leggerai, se public direttamente (che schifo!)  
o crei un metodo per leggerla esempio GetCodeB() che solo un return di CodeB.  
Ciao.pippo();  
if( Ciao.CodeB==10) ... // brutto  
if( Ciao.GetCodeB()==10) ... // meglio GetCodeB esempio di nome del metodo

---

<div class="post-metadata">

**Author:** ![salvo\_72](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/salvo_72/32/1241828_2.png) [@salvo\_72](https://forum.arduino.cc/u/salvo_72)\
**Post date:** [September 21, 2021, 5:02pm UTC](https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751/23 "2021-09-21T17:02:29Z")

</div>

Mi quoto da solo 😅

> [@salvo\_72](#):
>
> Volevo chiedere un altro aiutino ma non sapendo se aprire un altro post scrivo qui  
> Sono riuscito a scrivere il mio primo sketch e funziona, ora siccome è venuto un po lungo e per fare allenamento mi sono costruito la prima libreria che funziona anche quella, ora arrivo al problema:  
> Quando vado ad aprire un nuovo sketch metto il mio
> 
> ```arduino
> 
> #include “xxx.h”
> 
> xxx Ciao = xxx (2);
> 
> Void setup() {
> Serial.begin(9600);
> pinMode(LED_BUILTIN,OUTPUT);
> }
> Void loop(){
> Ciao.pippo();
> If ( **Ciao.code_b** =10){
> digitalWrite(LED_BUILTIN,HIGH);
> }
> }
> 
> ```
> 
> Quando scrivo l’istruzione if mi da l’errore “CodeB was not declared in this scope”  
> Mentre CodeB è dentro pippo() perché a monitor seriale mi fa vedere il valore 10 ( ovviamente se non scrivo l’istruzione if)  
> Spero di essermi spiegato bene  
> Grazie sempre

@cotestatnt  
Sei stato un grande è bastato scrivere come da te spiegato e magicamente “code\_b” (spero di aver usato la giusta sintassi questa volta) è ritornato con il valore allo sketch “principale”, (scusate ma non conosco ancora i termini da programmatore) e la variabile l’ho riportata al suo posto dentro .h  
@nid69ita  
Con “return code\_b;” non ritornava nulla, avevo già provato prima di chiedere aiuto.  
Non sto scrivendo qualcosa di top secret ma non voglio farmi “cazziare” più del dovuto per il mio vergognoso modo di programmare.  
Ecco ora che l’hai detto hai stuzzicato la mia curiosità su public e private, un sunto in italianese cortesemente 😁  
Grazie sempre a tutti  
P.s. Appena avrò il pc sottomano vi posterò un po’ di listato.

---

<div class="post-metadata">

**Author:** ![salvo\_72](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/salvo_72/32/1241828_2.png) [@salvo\_72](https://forum.arduino.cc/u/salvo_72)\
**Post date:** [September 21, 2021, 7:46pm UTC](https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751/24 "2021-09-21T19:46:09Z")

</div>

Come promesso

```cpp
#include "MyClass.h"

MyClass MyClass (2);

void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  }
void loop() {
  MyClass.myMethod();
  
  if (MyClass.myVar == 10) {
    digitalWrite(LED_BUILTIN, HIGH);
  }
  if (MyClass.myVar == 11) {
    digitalWrite(LED_BUILTIN, LOW);

//....... etc etc

  }
}

#ifndef MyClass_h
#define MyClass_h
#include <Arduino.h>
class MyClass{     
  public:        
  MyClass(byte pin);
  byte myVar;
  void myMethod();
  private:
  word myVar2[8];
  byte myVar3;
  word myVar4;
  };
  #endif

#include <Arduino.h>
#include "MyClass.h"

MyClass::MyClass(byte pin) {
  pinMode(pin, INPUT);
  myVar3 = pin;
}
void MyClass::myMethod() {

  myVar4 = pulseIn (myVar3, LOW);
  while (myVar4 >= 1000) {
    myVar4 = 0;

//........... etc etc

```

---

<div class="post-metadata">

**Author:** ![cotestatnt](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/cotestatnt/32/238781_2.png) [@cotestatnt](https://forum.arduino.cc/u/cotestatnt)\
**Post date:** [September 22, 2021, 6:32am UTC](https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751/25 "2021-09-22T06:32:35Z")

</div>

> [@salvo\_72](#):
>
> public e private, un sunto in italianese cortesemente

Sicuramente hai bene chiaro che cosa sono variabili e funzioni in C++.  
Quando si parla di una classe invece, le variabili che definisci all'interno della classe si chiamano **proprietà o attributi** (della classe) mentre le funzioni sono dette **metodi** (sempre della classe).

Proprietà e metodi possono essere definiti **public** e **private** (in realtà ce n'è anche un terzo classificatore **protected** ).

Se una variabile o un metodo è **private** può essere usata SOLTANTO all'interno della classe stessa e non sarà accessibile al resto del codice.  
_Facendo riferimento al tuo codice più su, se sposti `void myMethod()` nella sezione private, non potrai più usarla nel tuo sketch._

Metodi e proprietà public invece possono essere usati esternamente alla classe con la notazione _classe.proprietà_ o _classe.metodo_ come hai già fatto.

---

<div class="post-metadata">

**Author:** ![nid69ita](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/nid69ita/32/901258_2.png) [@nid69ita](https://forum.arduino.cc/u/nid69ita)\
**Post date:** [September 22, 2021, 7:00am UTC](https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751/26 "2021-09-22T07:00:39Z")

</div>

> [@salvo\_72](#):
>
> Con “return code\_b;” non ritornava nulla, avevo già provato prima di chiedere aiuto.  
> Non sto scrivendo qualcosa di top secret ma non voglio farmi “cazziare” più del dovuto per il mio vergognoso modo di programmare.

Come detto non sapendo cosa fa pippo() ...  
e poi sinceramente non ricordo che puoi farci con variabile messa fuori dalla classe ma dentro al .cpp anche perchè non è una cosa molto usata perchè non ha senso. come la vuoi usare tu DEVE essere una variabile della classe.  
Comunque come hai fatto funge ma ancora NON è molto bello.  
Di solito la variabile è private e poi usi 1 o 2 metodi per leggerla oppure leggerla/scriverla  
esempio variabile interna m\_pin privata, di solito poi crei una GetPin() e una SetPin()

---

<div class="post-metadata">

**Author:** ![salvo\_72](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/salvo_72/32/1241828_2.png) [@salvo\_72](https://forum.arduino.cc/u/salvo_72)\
**Post date:** [September 22, 2021, 7:21am UTC](https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751/27 "2021-09-22T07:21:08Z")

</div>

@cotestatnt  
Ok ora è un pelo più chiaro  
Credo che da hobbista mi limiterò nell’ uso delle classi 😅  
Grazie  
@nid69ita

> [@nid69ita](#):
>
> Di solito la variabile è private e poi usi 1 o 2 metodi per leggerla oppure leggerla/scriverla  
> esempio variabile interna m\_pin privata, di solito poi crei una GetPin() e una SetPin()

Vado ad acculturarmi su l’uso di queste due funzioni che non conosco, ma se avresti voglia e tempo mi faresti un esempio di come applicarla nel mio sketch?  
Grazie sempre a tutti  
@nid69ita  
Ok ci sono arrivato quelli (GetPin() e SetPin()) non sono funzioni perché nelle reference non ci sono ma dei metodi.  
Ormai come leggere i pin dei myVar [8] l’ho superato con la funzione descritta da @fratt, il mio ex problema era portare fuori la myVar2 da myMetodo.

---

<div class="post-metadata">

**Author:** ![salvo\_72](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/salvo_72/32/1241828_2.png) [@salvo\_72](https://forum.arduino.cc/u/salvo_72)\
**Post date:** [September 30, 2021, 1:23pm UTC](https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751/28 "2021-09-30T13:23:57Z")

</div>

Buon pomeriggio  
Sempre rimanendo in tema di manipolazione dei bit, non ho capito se è possibile effettuare una semplice rotazione, mi spiego meglio; se dopo un tot di tempo io ho un valore alto o un valore basso lo vorrei registrare su una variabile e alla fine del mio ciclo trovarmi qualcosa tipo b’0001101001.  
In assembly usavo l’istruzione “rlf”  
Spero di essermi spiegato  
Grazie sempre.

```cpp
tasto = digitalRead(8);
if (tasto==HIGH){
??????
}
if (tasto ==LOW){
????
}

```

---

<div class="post-metadata">

**Author:** ![nid69ita](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/nid69ita/32/901258_2.png) [@nid69ita](https://forum.arduino.cc/u/nid69ita)\
**Post date:** [September 30, 2021, 3:41pm UTC](https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751/29 "2021-09-30T15:41:56Z")

</div>

Io sinceramente non ho capito cosa devi fare.  
Comunque esiste l'operatore di shift sui bit sia a sinistra che a destra. sono \>\> e \<\<  
"[Guida C - Operatori Bitwise - Piero Tofy.it](http://www.pierotofy.it/pages/guide/Guida_C/Operatori_Bitwise/)"

---

<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:** [September 30, 2021, 6:02pm UTC](https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751/30 "2021-09-30T18:02:05Z")

</div>

Se ho capito bene la RLF ruota (shifta) i bit a sinistra di una posizione.  
In C puoi fare praticamente la stessa cosa con gli operatori bitwise come indicato da @nid69ita.  
Occhio però che mi pare di aver capito che la RLF è ciclica (cioè il bit che esce a sinistra poi rientra da destra), mentre lo shift in C non lo è (il bit che esce a sinistra viene perso).

---

<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:** [September 30, 2021, 6:12pm UTC](https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751/31 "2021-09-30T18:12:46Z")

</div>

> [@fratt](#):
>
> Occhio però che mi pare di aver capito che la RLF è ciclica (cioè il bit che esce a sinistra poi rientra da destra), mentre lo shift in C non lo è (il bit che esce a sinistra viene perso).

... difatti una è una " **rotate**" (_RLF dovrebbe essere "rotate left through carry"_), quella del 'C' è uno " **shift**" e quindi i comportamenti sono appunto diversi, esattamente come li descrivi tu 😉

Guglielmo

---

<div class="post-metadata">

**Author:** ![salvo\_72](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/salvo_72/32/1241828_2.png) [@salvo\_72](https://forum.arduino.cc/u/salvo_72)\
**Post date:** [September 30, 2021, 7:49pm UTC](https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751/32 "2021-09-30T19:49:18Z")

</div>

@nid69ita  
Si avevo già trovato quella guida e dalle reference avevo capito che lo shift non è quello che "servirebbe" a me  
@fratt  
si esatto la rlf ruotava i bit mentre la "\<\<" non fa la stessa cosa  
@gpb01  
il problema è proprio questo che non si comportano come desidererei io  
@nid69ita

> [@nid69ita](#):
>
> Io sinceramente non ho capito cosa devi fare.

Cerco di spiegarmi meglio; vorrei "salvare" su una variabile " myvar" una lettura di un sensore, ovvero quanti 1/0 legge in 500ms, sono riuscito a "salvare o tutti gli 1 o tutti gli 0 ma vorrei visualizzare un treno di bit come descritto sopra.

```arduino
int myvar;
int tasto;
int i = 0;
void loop(){
tasto = digitalRead(8);
if (tasto==HIGH){
myvar = 1 << i;
i++;
}
if (tasto ==LOW){
myvar = 0 << i;
i++;
}
}

```

cosi come ho scritto sposta solo 1

---

<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:** [September 30, 2021, 8:22pm UTC](https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751/33 "2021-09-30T20:22:09Z")

</div>

Scusa e perché non ti va bene lo shift? Tanto più di 32 bit (c_he il massimo che puoi definire su Arduino_) **NON** puoi avere e ruotare non capisco a che serve ... leggi, memorizzi e sposti di una posizione, dopo 32 letture hai tutti i risultati, non vedo a che serve la rotazione ... 🙄

Guglielmo

---

<div class="post-metadata">

**Author:** ![salvo\_72](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/salvo_72/32/1241828_2.png) [@salvo\_72](https://forum.arduino.cc/u/salvo_72)\
**Post date:** [September 30, 2021, 8:30pm UTC](https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751/34 "2021-09-30T20:30:56Z")

</div>

@gpb01  
Si scusami a me non serve per forza ruotare e che non riesco a far spostare lo 0 se shifto una sequenza di 1 funziona se faccio la prova con lo 0 mi azzera tutta la variabile .

---

<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:** [September 30, 2021, 9:38pm UTC](https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751/35 "2021-09-30T21:38:21Z")

</div>

Secondo me sbagli candeggio...  
Forse ti serve una cosa così:

```cpp
if (tasto==HIGH){
  myvar = (myvar << 1) + 1;
}
if (tasto ==LOW){
  myvar = myvar << 1;
}

```

---

<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:** [October 1, 2021, 9:22am UTC](https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751/36 "2021-10-01T09:22:07Z")

</div>

> [@salvo\_72](#):
>
> Cerco di spiegarmi meglio; vorrei "salvare" su una variabile " myvar" una lettura di un sensore, ovvero quanti 1/0 legge in 500ms

... con che cadenza di acquisizione? Perché, come ti ho detto, su Arduino la variabile più lunga è 32 bit quindi 500 msec / 32 = 15.6 msec, quindi, un campionamento con tempi inferiori ai 16 msec **NON** lo puoi fare o perdi i dati.

Se invece vuoi fare qualche cosa con tempistiche più ridotte, allora ti tocca studiare bene la cosa utilizzando un array e, mano mano, durante l'acquisizione, cambiare elemento dell'array.

Facci capire quali sono le tue REALI esigenze.

Guglielmo

---

<div class="post-metadata">

**Author:** ![Claudio\_FF](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/claudio_ff/32/239118_2.png) [@Claudio\_FF](https://forum.arduino.cc/u/Claudio_FF)\
**Post date:** [October 1, 2021, 12:00pm UTC](https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751/37 "2021-10-01T12:00:22Z")

</div>

> [@salvo\_72](#):
>
> non serve per forza ruotare e che non riesco a far spostare lo 0 se shifto una sequenza di 1 funziona se faccio la prova con lo 0 mi azzera tutta la variabile

Non mi è chiaro, ma [qui un esempio](https://forum.arduino.cc/t/riflessioni-sul-bounce-che-si-prende-gioco-di-me-povero-nabbo/599842/22) di acquisizione di 4000 campioni in 100ms stivati in 500 byte, [e qui](https://forum.arduino.cc/t/fare-lxor-di-due-stringhe-in-c/885864/12) il rotate left/right di N posizioni dei bit di una variabile intera.

---

<div class="post-metadata">

**Author:** ![salvo\_72](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/salvo_72/32/1241828_2.png) [@salvo\_72](https://forum.arduino.cc/u/salvo_72)\
**Post date:** [October 1, 2021, 12:36pm UTC](https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751/38 "2021-10-01T12:36:51Z")

</div>

@Claudio_FF  
Grazie Claudio da una prima lettura veloce sembrerebbe proprio quello che stavo cercando,  
Questa sera mi metto sotto e faccio i miei vari test.

---

<div class="post-metadata">

**Author:** ![salvo\_72](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/salvo_72/32/1241828_2.png) [@salvo\_72](https://forum.arduino.cc/u/salvo_72)\
**Post date:** [October 1, 2021, 5:04pm UTC](https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751/39 "2021-10-01T17:04:41Z")

</div>

Alla fine ho chiuso la "quadra"  
Come suggerito da @Claudio_FF mi sono acculturato e dopo prove, prove, prove, ecc... ho capito che per quello che dovevo fare io non mi funzionava, la mia condizione era che partivo da una variabile vuota e la dovevo riempire di bit ma con "\<\< \>\>" quando spostavo, lui mette sempre degli 0 e non mi faceva aggiungere gli 1, poi rileggendo i post ho seguito l'indicazione di @gpb01 e ho usato bitWrite(), ora vi allego un pò di listato

```cpp
long myvar;
int tasto;
int i = 0; // bit di partenza
void loop(){
tasto = digitalRead(8);
if (tasto==HIGH){
bitWrite(myvar,i,1); // se alto memorizzo 1 nel bit(i) di myvar
}
if (tasto ==LOW){
bitWrite(myvar,i,0); // se basso memorizzo 0 nel bit(i) di myvar
}
i++;

```

come si dice dalle mie parti cercavo l'asino e c'ero a cavallo 🤣 🤣

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [January 29, 2022, 5:05pm UTC](https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751/40 "2022-01-29T17:05:26Z")

</div>

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.

[Previous page](https://forum.arduino.cc/t/copiare-i-bit-di-variabili-su-una-variabile/906751.md?page=1)
