Que realiza esta linea de código?

encontré un código en un foro de internet y básicamente no entiendo bien que realiza en estas líneas
el código completo consiste en utilizar el protocolo firmata para pasar un dato analógico a digital.

void reportAnalogCallback(byte pin, int value) {
  if (value == 0) {
    analogInputsToReport = analogInputsToReport & ~(1 << pin);
  } else {  // everything but 0 enables reporting of that pin
    analogInputsToReport = analogInputsToReport | (1 << pin);
  }
}

Creo que simplemente necesita comprender y estudiar los operadores que realizan operaciones en valores binarios. Se que no es fácil al principio pero si quieres profundizar en temas de bajo nivel tienes que estudiar.

Por ejemplo "<<" es una operación de "shift" de bits, es decir con (1 << 2) el valor "1", binario "00000001", se desplaza a la izquierda 2 posiciones, obteniendo el valor "00000100", ese es el valor decimal 4.

El operador "~" a su vez invierte todos los bits, de modo que "~ 00000100" se convierte en "11111011".

El operador "&" es un "AND" binario (bit a bit) así que si tomo un byte, decimos "10110101" y hago AND con ese valor "11111011" obtengo "10110001": básicamente cuando un valor es usado con "&" se considera una "máscara" de bits, es decir donde la "máscara" es "1" se replica en salida el bit correspondiente, mientras que con "0" se resetea ese bit.

Por lo tanto, con "11111011" estoy diciendo que reinicie el tercer bit y, de hecho, "10110101" y "11111011" = "10110001"

Hola,

La respuesta de @docdoc es muy buena.
Si quieres ver algo funcional solo con matemáticas (sin OR, AND, NOT, SHL) te paso el link
https://wokwi.com/projects/345129749338653266

Obviamente el uso de operadores binarios agiliza la velocidad de ejecución.
Fíjate en la línea 16: analogInputsToReport=255-((255-analogInputsToReport) + (255-resultado)); que realmente se puede realizar con operadores de bits de forma mucho más fácil y eficiente que usando matemáticas:analogInputsToReport=analogInputsToReport & resultado;

Como verás, en C++ se intenta simplificar las operaciones por varios motivos, y no es hacerlo más 'human-readable' sino que se ejecute más rápidamente, menor consumo de memoria, menor riesgo de fallos de desarrollo, ...

Nota: 255 es en binario 11111111

Ahora bien, y ampliando lo último que dice @docdoc del trozo de código que has pegado intuyo que la funcionalidad es la siguiente:
Si invocamos a ese procedimiento reportAnalogCallback espera dos parámetros que son qué pin (bit) ha sido y si se ha encendido o apagado y ésto mantiene la variable analogInputsToReport con los valores de los 8 pines posibles que puede contener un byte.

Si tenemos en analogInputsToReport, en binario: 11100111 e invocamos reportAnalogCallback(3,0) nos apagará el bit tercero (empezando por la derecha) con lo que analogInputsToReport quedará así: 11100011 y si invocamos ahora reportAnalogCallback(3,1) volverá a encender el bit tercero quedando así: 111000111

Esto se hace así para no tener que conservar 8 variables una por cada pin y tener varios IF preguntando si el pin==3 etc etc
Respecto a los operadores binarios, pueden ser cambiado por fórmulas matemáticas como has visto, por ejemplo:
1<<2 se puede cambiar por 1*2*2
1<<5 se puede cambiar por 1*2*2*2*2*2
En el fuente que te he pasado lo hace con matemáticas pero repito que no es nada eficiente, es por si te aclara más el uso de operadores binarios.

Saludos.

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