Vit (22.07.2007 14:33, просмотров: 1) ответил Т.Достоевский на Не понял как это использовать совместно с if ?
Как выражение;) if/*если*/(выражение == true) {делаем ВЫРАЖЕНИЕ1}
else/*иначе, т.е. выражение == false*/{делаем ВЫРАЖЕНИЕ2}
if/*если*/((!выражение) == true) {делаем ВЫРАЖЕНИЕ2}
else/*иначе, т.е. выражение == true*/{делаем ВЫРАЖЕНИЕ1}
В Си логическое true равно 1 (в других языках бывает, например, -1), а значение false равно 0. Однако действует умолчание/соглашение, согласно которому всё, что не false равно true (в качестве результата логического выражения точно).
Т.е. принимая, например,
#define LED (5)
результатом выражения (PINC & (1<<LED)), в преобразованном виде
(PINC & 0x20), может быть либо 0x20, либо 0x00. (!(PINC & (1<<LED))) может давать два значения - !0x20 и !0x00, что даст false (в отличие от выражения ~0x20, которое даст 0xDF) и true соответственно, т.е. 0 и 1. В принципе в if можно поставить и (PINC & (1<<LED)) и не заморачиваться, а через else выбрать что делать. Что обычно и делается. Но иногда хочется получить значение какого-то бита как число 0 или 1, тогда одна или две ЛОГИЧЕСКИХ инверсии (!false эквивалентно true, а !true эквивалентно false).
Например, в регистре настроек UASRT-а есть бит удвоения скорости, а мы хотим по формуле из DS рассчитывать значения регистра делителя в формуле в зависимости от делителя где-то есть умножение на 2. Вместо этого умножения подставлям вместо
if(значение бита удвоения){(множитель*2)}
else{(множитель*1)}
выражение вида
(множитель<<значение бита удвоения),
где значение бита удвоения эквивалентно (!!(PORT&(1<<bitNo))).
Компиляторы такое обычно хорошо оптимизируют.