Chiarimento su XOR

Ciao a tutti
Il risultato di una XOR viene effettuato tramite 2 operandi o variabili ,come da foto, e questo è tutto chiaro ma non riesco a capire questo : val ^= 1 quando la variabile è una sola. Spero di esser stato chiaro.
Grazie a tutti in anticipo.
Guido

#define ledR 2                  
unsigned long previousMillis   = 0;
byte val                       = 0; 

void setup() {
  pinMode (ledR, OUTPUT); 
}
void loop() {
  if ((millis() - previousMillis ) >= 1000) { 
    previousMillis = millis(); 
       val ^= 1;
        digitalWrite(ledR, val);
  }
}

L'XOR con 1 di 0 fa 1, mentre la stessa operazione tra 1 e 1 fa 0, in pratica è un modo che permette di invertire il valore di un bit, è meglio usare una variabile di tipo boolean piuttosto che una di tipo byte, con una operazione che richiede un solo ciclo macchina.

Parli di "una sola variabile", forse ti sfugge l'interpretazione dell'istruzione.
Stai facendo lo XOR fra la variabile vai e la costante 1 e metti il risultato nella stessa variabile val.
Come vedi stai sempre lavorando con DUE bit, uno è val e l'altro è 1.

Insomma, è come scrivere val = val ^ 1.

grazie a tutti per le delucidazioni ora ho capito !!
grazie ancora, alla prossima.
Guido

È come dire o l' uno o l'altro, altrimenti niente.
Sulla base del singolo bit. Ovviamente per dimensioni più grandi si fa l' operazione sui singoli bit di stesso livello (bit 0 con il corrispettivo bit 0 dell' altro valore).

SukkoPera:
Insomma, è come scrivere val = val ^ 1.

Aggiungiano che il C accetta questa forma contratta per tutte le operazioni.
Quindi puoi vedere anche val = val +1; scritto come val += 1;

e che C conosce anche il autoincremento e autodecremento di 1 prima e dopo l' uso della variabile:

++i e i++ o
--i e i--

Ciao Uwe