stany = twiread(NOACK);
twistop();
LCD_GoTo(22,1);
LCD_WriteText(" ");
LCD_GoTo(22,1);
int i = 128;
for (; i; i>>=1)
LCD_WriteText((stany&i?"1":"0"));
Przeanalizujmy zatem. Linie 1 i 2 pomijam bo to dzieło kolegi. Linie 3 i 4 są zbędne. Linia 5 ustawia pozycję kursora wyświetlacza.
Linia 6 wystarczy zmienna 8 bitowa bez znaku (char lub uint8_t), oszczędzamy jeden bajt SRAM. Ustawiamy na 128 czyli 10000000 binarnie.
Operacja i>>=1; przesuwa bit o jeden w prawo z każdym obiegiem pętli, czyli po 10000000 mamy 01000000, potem 00100000 i na końcu 00000001. Kolejne przesunięcie o jeden w lewo daje zero, czyli pętla się przerywa.
LCD_WriteText((stany&i?"1":"0"));
To, co mamy w zmiennej
stany maskujemy bitowym operatorem and. ?: to jest operator trójargumentowy, w rzeczywistości to jest if else, czyli rozpisując
if (stany&i)
LCD_WriteText("1");
else
LCD_WriteText("0");
Teraz dlaczego kolega powinien sprawdzić sobie i używać funkcji pojedyńczego znaku zamiast łańcucha ? Ponieważ funkcja LCD_WriteText i tak wywołuje tą funkcję, tylko trzeba wykonać jeden call więcej, jeden powrót i dwa sprawdzania warunków, które są bez sensu. Nie liczę tutaj push/pop. Dodatkowo, "1" zajmuje dwa bajty w pamięci i "0" zajmuje dwa bajty w pamięci. Łącznie o dwa za dużo.
Gdyby było coś niezrozumiałe, proszę o dodatkowe pytanie.