AVR Bitwise Operations

1

Estoy empezando a aprender más sobre la programación de AVR ATMEGA. Al leer un artículo sobre el funcionamiento interno de Arduinos, estoy aprendiendo cómo se estructura el método shiftOut . Estoy un poco familiarizado con las operaciones bitwise hasta ahora, pero tengo una expresión que aún no entiendo:

void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
{
    uint8_t i;

    for (i = 0; i < 8; i++)  {
        if (bitOrder == LSBFIRST) {
            PORTD |= !!(val & (HIGH << i)); 
        } else {
            PORTD |= !!(val & (HIGH << (7 - i)));           
        }   
        PORTB |= (HIGH << clockPin);
        PORTB ^= (HIGH << clockPin);
    }
}

La línea PORTD |= !!(val & (HIGH << i)); no es 100% clara para mí. Entiendo que establecí el i-th bit High en PORTD, pero lo que da !! mean y val&(HIGH <<i))

Sé que esto puede sonar básico, pero ¿puedes ayudarme?

    
pregunta sesc360

1 respuesta

1

En C, ! es el operador lógico de negación: !x tiene el valor 1 si x es falsy (es decir, cero), y el valor 0 si x es verdadero (es decir, no es cero). !!x tiene solo dos negaciones consecutivas, lo que da el mismo valor de verdad lógica que el mismo x , pero colapsa todos los valores verdaderos a 1 . (Vale la pena recordar que, por ejemplo, 2 , 0x1000 y -123 son verdaderos en C.)

(val & (HIGH << i))

Esto es solo HIGH desplazado a la izquierda por i bits, y ese valor y eliminado con val . es decir, si HIGH es 1 , selecciona el bit i th de val (contando desde cero).

Así que, por ejemplo si i es 3, (val & (1 << i)) podría ser 0x08 , y el siguiente !! lo colapsaría a 1 .

    
respondido por el ilkkachu

Lea otras preguntas en las etiquetas