Цитата(defunct @ Feb 12 2006, 08:08)

Цитата(impuls-v @ Feb 12 2006, 03:54)

!( UCSRA & (1<<UDRE)),
эта запись обозначает - проинвертировать значение байта прочитанного из UCSRA из которого выделен только бит UDRE.
Цитата
а точнее 1<<UDRE ведь << это сдвиг регистра влево
не регистра, а 1 на некоторое число UDRE. UDRE - константа, которая соответствует позиции бита UDRE в регистре UCSRA.
! - логическое НЕ, а не побитовое, т.е. значит "инвертировать логическое значение выражения ( UCSRA & (1<<UDRE))" , что в свою очередь определяется умолчанием, принятым в С для результатов выражений при использовании их как логическое значение - "всё, что не ноль есть единица", точнее TRUE. Не во всех языках такое умолчание есть.
Далее UDRE - не просто число, а действительно позиция (по сути номер бита в байте), т.е. (1<<UDRE) обозначает получить маску для сравнения нужного бита в байте. Производится сдвиг левой части (в данном случае 1, но может вполне быть что-то другое

на число, указанное в правой части (UDRE), а не наоборот. Помнится, что в ATmega128 UDRE0 5-й (от 0 до 7) бит в байте UCSR0A, соответственно (1<<UDRE) эквивалентно (1<<5), эквивалентно (0x01<<5), эквивалентно 0x20 (00100000). Соответственно проверка значения регистра на флаг осуществляется путём наложения маски на его значение (побитовое И - зануление всех "ненужных" битов), т.е. UCSRA0 & 0x20 даст число отличное от нуля (а именно 0x20) при установленном 5-м бите (UDRE0), иначе будет нуль. 0 - FALSE, 0x20 - TRUE, соответственно !(FALSE) будет эквивалентно TRUE, и наоборот - !(TRUE) эквивалентно FALSE.
Т.е. запись !( UCSRA & (1<<UDRE)) обозначает "не установлен бит UDRE в байте UCSRA".