Это Евгений уже понял, я думаю
Лучше сам синтаксис объяснить:
sfr|=(1<<bit);
В языке С разрешено не указывать имя переменной, если с ней проводится операция и результат присваивается той же переменной. т.е.
sfr|=x; равносильно
sfr=sfr|x; Аналогично действуют операторы +=, -=, *=, /=, итд.
Операторы побитного сдвига << и >> это такие же операторы как +,-,*,/ Иван уже объяснил как они действуют (хотя есть тонкости).
Еще один загадочный оператор для непосвященных это знак вопроса, например:
y=x>0?x:-x
это удобная запись следующей логики:
if(x>0) y=x else y=-x;
Менее тривиально эта конструкция выглядит при использовании авто-конверсии:
sX=mE?'':'\'';
частое недоумение вызывают результаты работы популярных в С унарных операторов ++ и --, они вроде бы просто прибавляют или вычитают единицу из переменной. Например:
b=1;
b++; //теперь b=2
b--; //теперь b=1
--b; // b=0
++b; // b=1
Собственно недоумение возникает при трейсинге результатов этих унарных операций когда они входят в более сложные выражения или участвуют в операциях сравнения и циклах. Нужно знать разницу 2-х способов использования унарных операций - префиксное (++x;) и постфиксное (x++;). В первом случае сначала производится инкремент переменной, а потом использование результата в обрамляющем выражении, а во втором значение переменной сначала используется в выражении, а затем инкрементируется (для использования в следующем выражении после ";" или "{" ). Например:
a=1;
b=1+a++;// Теперь b=2, а не 3
b=1+a; // Теперь b=3 т.к. уже a=2
if(a++>2){ b=0; }; //b=3 но a=3 (a>2)
b=a-----a; // b=1, a = 1