Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по основам алгоритмизации и программи....doc
Скачиваний:
41
Добавлен:
02.11.2018
Размер:
2.69 Mб
Скачать

Операции поразрядной арифметики

Поразрядные операции используются для преобразования информации, содержащейся в памяти ПЭВМ, путем изменения некоторых отдельных, либо всех разрядов (битов) памяти. К числу поразрядных операций относятся сдвиговые операции (вправо (>>) и влево (<<)) и операции конъюнкции (&), дизъюнкции (|), исключающее ИЛИ (^) и поразрядная инверсия (~). Операция ~i приводит к тому, что все разряды (биты), соответствующие переменной i, изменяют свое значение на противоположное, например:

i=j>>k; i=j<<k;

i=j&k; i=j|k;

i=j^k; j=~k;

Операнды побитовых операций должны быть целого типа, но их типы могут быть отличными (выполняются обычные арифметические преобразования). Тип результата определяется типом операндов после преобразования. Результат операции сдвига не определен, если второй операнд отрицательный.

#include <stdio.h>

void main() // демонстрация побитовых операций и сдвигов

{ int i, j, k, l, m, n;

i=0xab00; j=0xabcd; // i и j в шестнадцатиричной с/с

k=i&j;

l=i | j;

m=i ^ j;

n= ~j;

printf("\ni=%x, j=%x, k=i&j=%x, l=i|j=%x, m=i^j=%x, n=~j=%x\n",

i,j,k,l,m,n);

// выводится: i=ab00, j=abcd, k=i&j=ab00, l=i|j=abcd, m=i^j=cd,

// n=~j=5432; заметим, что abcd+5432=ffff,

// поэтому ~ ещё называют поразрядным дополнением

i=10; j=16; k=i<<2; l=j>>3;

// i<<n равносильно i * (2 в степени n); j>>n = j / (2 в степени n)

printf("\ni=%d, j=%d, k=i<<2=%d, l=j>>3=%d\n",i,j,k,l);

// выводится: i=10, j=16, k=i<<2=40, l=j>>3=2

}

Язык С(С++) дополнительно позволяет расширить возможности оперирования некоторыми стандартными операциями, рассмотренными выше. Так, выражение i=i+3 может быть записано i+=3. Сказанное выше справедливо и для некоторых других операций, т.е. вместо знака + в выражении может быть записаны символы (-, *, /, %, <<, >>, & ,| ,^).

Логические операции

Логические операции выполняют логическое отрицание (!), логическое И (&&) и логическое ИЛИ ( || ). Операнды логических операций могут быть целого, вещественного или адресного типа. Типы первого и второго операндов могут быть различными. Операнды логических выражений вычисляются слева направо. Если значения первого операнда достаточно, чтобы определить результат операции (значение первого операнда равно нулю для логического И и единице для логического ИЛИ), то второй операнд не вычисляется.

Логические операции не выполняют стандартные арифметические преобразования. Вместо этого они вычисляют каждый операнд с точки зрения его эквивалентности нулю. Указатель имеет значение 0, если это значение явно установлено путем присваивания или инициализации. Результатом логической операции является 0 или 1. Тип результата есть int.

#include <stdio.h>

void main()

{ int i, j, k, l, m, n;

i=10; j=0; k= j && (i++); // т.к. j=0, то i не инкрементируется

m=!j; l= i || (j++); // т.к. i ¹ 0, то j не инкрементируется

printf("\n i=%d, j=%d, k=j && (i++)=%d, m= !j=%d ", i, j, k, m);

printf("\n l= i||(j++)=%d, i=%d, j=%d\n", l, i, j);

}

Результатом выполнения программы будет:

i=10, j=0, k=j && (i++)=0, m=!j=1

l=i||(j++)=1, i=10, j=0