Almacenar array booleano de otra variable byte o int

Hola a todos comunidad de developers ! mil saludos, recurro a este foro para plantear la siguiente situación : Tengo una pantalla con comunicación serial de la cual recibo datos, justamente estoy recibiendo los valores de 7 bits por ejemplo :

byte datos_pantalla = 0x7F;
// Lo que en binario seria 0b0111 1111

Ahora lo que necesito es crear un array booleano para almacenar cada bit independiente con su valor TRUE o FALSE de acuerdo a la variable "datos_pantalla" por ejemplo :

datos_pantalla = 0x75;

bool binario[7] = datos_pantalla;

Serial.println("El bit 0 es :") // En este ejemplo debe ser 1
Serial.println("El bit 1 es :") // En este ejemplo debe ser 0
Serial.println("El bit 2 es :") // En este ejemplo debe ser 1
Serial.println("El bit 3 es :") // En este ejemplo debe ser 0
Serial.println("El bit 4 es :") // En este ejemplo debe ser 1
Serial.println("El bit 5 es :") // En este ejemplo debe ser 1
Serial.println("El bit 6 es :") // En este ejemplo debe ser 1

De antemano muchas gracias se que es una cuestión simple aunque quiero aprender cosas nuevas y ver desde el punto de vista de otros expertos, cual es el método mas limpio, organizado y con el uso eficiente de los recursos en programación !

Puedes usar la función bitRead() para leer el estado de cada bit de la variable.
Es más que simple y más directo que lo que planteas.
Mira

Mil gracias por responder ! efectivamente es la Solución

for (int x = 0; x < 7; x++) {
          binario[x] = bitRead(datos_pantalla, x);          
        }

Hola de nuevo !, recién se me presento el caso contrario, ahora como puedo convertir el array booleano y transferirlo a la variable entera o byte ... por ejemplo :

bool binario[7] = {0,1,1,1,0,0,1};
byte transferir_binario = binario; // Tendría un valor de 57 decimal - 0b00111001

Pero no te dije que hagas eso.
La idea es que leas directamente los bits de la variable y no usar un array.
Ya tenés en un byte los 7 bits que necesitas, ¿para qué el array?

El array es para clasificar cada bit para el control individual, por ejemplo suponiendo que sean opciones al igual que al pulsar 7 botones diferentes, entonces cada bit representa la activación o desactivación de una opción por ejemplo bit 0 : Activar o no relé 1 , bit 1 : Activar o no relé 2 … etc. Ahora el entero solo lo necesito para poder enviar por el puerto serial por ejemplo ...

Sin bitread es posible así:

bool bites[8];  //bool donde se guardarán los true o false según peso (0 menor peso, 7 mayor peso)
byte valor;  //variable que convertiremos a array de bits
int b; //para recorrer bucles
void setup() {
  Serial.begin(9600);
  valor=123;
  Serial.print("Valor actual:");
  Serial.println(valor);
  //guardar valores en el array bool:
  for (int b=0;b<8;b++){
    if ((1<<b) & (valor)) bites[b]=true; else bites[b]=false;
  }
  //imprimimos valores OJO: están invertidas las posiciones
  Serial.print("Valores bits:");
  for (int b=0;b<8;b++) Serial.print(bites[b]);
  Serial.println("\nAhora valor vale cero");
  valor=0;
  //ahora pasamos del array bool a "valor"
  for (int b=0;b<8;b++){
    if (bites[b]) valor=valor | (1<<b);
  }
  Serial.print("Ahora valor vale:");
  Serial.println(valor);
  Serial.println("fin");
}

void loop() {
}

Y esta es la salida:

Valor actual:123
Valores bits:11011110
Ahora valor vale cero
Ahora valor vale:123
fin

Saludos.

Veo que no entendiste la idea...

Armas un array booleano de 8 posiciones, lo que ocupa 8 bytes. ¿De acuerdo?

En esos bytes almacenas el estado de los bits de otro byte. ¿Si?

Ahora, ¿que te impide leer directamente el bit de una copia de ese byte?

Ahora haces algo así

for (int x = 0; x < 7; x++) {
  binario[x] = bitRead(datos_pantalla, x);          
}

  

Imagino que luego en otra parte harás

if (binario[x]) {
  // lo que sea
}

¿Por qué no hacer ésto?

byte binario = datos_pantalla;

Y luego

if(bitRead(binario, x)) {
  // lo que sea
}

Y de paso ahorras 7 bytes de memoria porque

byte binario; // 1 byte

bool binario[8]; // 8 bytes

Y si necesitas hacer algo como

binario[x] = true;
// o
binario[x] = false;

Haces

bitSet(binario, x);
// o
bitClear(binario, x); 

Saludos

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