Поразрядные (побитовые) операции
Их можно производить с любыми целыми числами, переменными и константами. Их нельзя использовать с переменными типа float, double, long double.Поразрядными операциями являются:
& AND (и),
| OR (или),
^ XOR,
~ NOT (не),
<< сдвиг влево,
>> сдвиг вправо.
Операции AND, OR, NOT, XOR полностью соответствуют аналогичным логическим операциям. Поразрядные операции позволяют, в частности, обеспечить доступ к любому биту информации. Часто эти операции используют в драйверах устройств, программах, связанных с принтером, модемом и другими устройствами.
При выполнении поразрядной операции над двумя переменными, например типа char, операция производится над каждой парой соответствующих разрядов. Отличие поразрядных операций от логических и операций отношения состоит в том, что логическая операция и операция отношения всегда дают в результате 0 или 1. Для поразрядных операций это не так.
Приведем следующий пример:
Если надо установить значение старшего разряда переменной типа char равным нулю, то удобно применить операцию &(and).
ch = ch & 127;
Пусть ch = ’A’
‘A’ в двоичном коде: 11000001;
127 в двоичном коде: 01111111
‘A’ & 127: 01000001.
Если мы хотим установить для старшего разряда 1, удобна операция OR (или)
ch = ch | 128
‘A’ 11000001
127 10000000
‘A’ | 128 11000001.
Поразрядные операции удобны для хранения в сжатом виде информации о состоянии on/off (вкл/выкл). В одном байте можно хранить 8 таких флагов.
Операция сдвига. Форма представления:
value >> число позиций; value<< число позиций.
Пример. Двоичное представление числа х = 9: 00001001.
Тогда x = 9<<3: 01001000,
x = 9>>3 : 00000001.
Пример. Пусть unsigned char x = 255 в двоичном виде 11111111.
Значения выражения сдвига будут иметь вид:
Х = х<<3: 11111000
Х = х>>3: 00011111
X = x>>5: 00000111.
Управляющие конструкции языка Си
Организация ветвящихся процессов: оператор if
Программа - это описание средствами языка программирования алгоритма решения задачи. Любой алгоритм можно разделить на следования, ветвления и циклы. В простейшем случае имеют место только следования.
Если имеет место проверка условий и выбор одного из возможных направлений продолжения вычислений, то имеет место ветвление (Рис.2.1).
Да Нет
Рис.3.1
Ветвления в программах осуществляются с помощью оператора условия if. Этот оператор используется в двух формах:
а) в полной форме:
if(выражение) (if - если, else - иначе)
оператор_1;
Else
оператор_2;
Правило выполнения: если выражение в скобках (здесь некоторое условие) не равно нулю, т.е. “истина”, то выполняется оператор_1. В противном случае выполняется оператор_2.
б) в сокращенной форме:
if (выражение)
оператор_1;
Если выражение в скобках (…) не равно нулю, то выполняется оператор_1, в противном случае управление передается следующему оператору программы.
Операторы_1 и _2 могут быть как простыми, так и составными. В последнем случае группа операторов должна заключаться в фигурные скобки:
{
оператор_1;
оператор_2;
…………
оператор_n;
}.
Каждый оператор внутри скобок должен заканчиваться “;”.
Пример 3.1:
# include <conio.h>
void main ( void)
{
clrscr ();
float a, b, rez ;
printf (“Введите значение а и b: “);
scanf (“%f %f “, &a, &b);
if (b= =0)
printf (“Отношение a / b не определено \n “);
Else
{
rez = a / b;
printf (“Отношение a / b равно %6, 3f\n”, rez);
}
getch( );
}
Еще один фрагмент:
. . . . . . . . .
if ( (ch = getch( ) )= =’g’)
puts (“Конец работы \n”);
Else
puts (“Работа продолжается \n”);
Выражение после слова if может состоять из нескольких операций присваивания, разделяемых запятыми. Значение всего выражения будет определяться последним присваиванием. Это справедливо для любого составного выражения. Например:
if (с=сh,ch=getch( ) ).