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

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

Преобразования, выполненные операциями сдвига, не обеспечивают обработку ситуаций переполнения и потери значимости. Информация теряется, если результат операции сдвига не может быть представлен типом первого операнда, после преобразования.

Отметим, что сдвиг влево соответствует умножению первого операнда на степень числа 2, равную второму операнду, а сдвиг вправо соответствует делению первого операнда на 2 в степени, равной второму операнду.

Примеры:

int i=0x1234, j, k ;

k = i<<4 ; /* k = 0x0234 */

j = i<<8 ; /* j = 0x3400 */

i = j>>8 ; /* i = 0x0034 */

  1. Поразрядные операции:

К поразрядным операциям относятся: операция поразрядного логического "И" (&), операция поразрядного логического "ИЛИ" (|), операция поразрядного "исключающего ИЛИ" (^).

Операнды поразрядных операций могут быть любого целого типа. При необходимости над операндами выполняются преобразования по умолчанию, тип результата - это тип операндов после преобразования.

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

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

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

Пример.

int i=0x45FF, /* i= 0100 0101 1111 1111 */

j=0x00FF; j= 0000 0000 1111 1111 */

char r;

r = i^j; /* r=0x4500 = 0100 0101 0000 0000 */

r = i|j; /* r=0x45FF = 0100 0101 0000 0000 */

r = i&j; /* r=0x00FF = 0000 0000 1111 1111 */

101 Наиболее употребимы двоичная, восьмеричная, десятичная и шестнадцатеричная система исчисления.

Двоичная система исчисления

Для записи любого числа используются два символа, ноль и единица.

Рассмотрим запись числа в пределах от 0 до 16.

Аналогично десятичной системе используется система разряда. В каждом из разряда может быть, записан или 0 или 1.

Рассмотрим запись чисел от 0 до 16 с четырьмя разрядами.

0000=0

0001=1

0010=2

0011=3

0100=4

0101=5

0110=6

0111=7

1000=8

1001=9

1010=10

1011=11

1100=12

1101=13

1110=14

1111=15

На этом примере видно значение числа разрядов для записи числа. Для записи числа 16 требуется уже 5 разрядов, алгебраически соотношений между двоичной и десятичной системы можно представить в следующей форме: 20+21+22+23 +24…=число в десятичной системе исчисления

(старший разряд)101101(младший разряд)-двоичная

1*20+0*21+1*22+1*23+0*24+1*25=1+4+8+32=45

Перевод числа из десятичной системы в двоичную, осуществляется путем деления десятичного числа на 2.

45/2=22/2=11/2=5/2=2/2=1

101101

Как правило, такие преобразования вручную не производятся, однако на этом принципе построена работа всей цифровой техники, любое запоминающее устройство хранит одну из двух состояний, ноль или единицу, например:

ОЗУ (микросхема).

Один разряд двоичного числа и есть один бит информации. Последовательность записанных подряд разрядов называется словом, по количеству разрядов определяется длина слова в битах.

8 бит =1 байт

По аналогии с двоичной системой рассмотрим восьмеричную и шестнадцатеричную систему исчисление.

(2)-0, 1

(8)-0,1, 2,3,4,5,6,7

(16)-0,1,2,3,4,5,6,7,8,9,a, b, c, d, e, f.

(2), (8), (16) = ai

C0*a0+ C1*a1+ C2*a2+… Cj*aj

Ffe= e*160+f*161+f*162=14*1+15*16+15*256=

Иногда (в технике производства 1965-1980 годов) использовалось так называемая двоично-десятичная система исчисления. В этой системе исчисления имелись единицы, десятки, сотни …, для десятичной системы, а запись в двоичной, то есть единицы записывали в двоичной системе.

Для записи в двоичной системе исчисления использовался различный код, разновидностями кода являлся:

1)прямой код

2)обратный код

3)дополнительный код

Прямой код это код где младший разряд справа, старший слева.

Обратный код это код где младший разряд слева, старший справа.

Дополнительный код это разность между двумя кодами.

101011=43-прямой код

110101=-обратный код

+(1)10001 единица уходит в конец

Будем предполагать, что работу осуществляем лишь прямым кодом.

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

103 В С++ есть условная операция, очень похожая  на условный оператор выбора if else. Условная операция «? :» называется тернарной операцией (то есть трёхместная (имеет три операнда), единственная в C++).

Форма записи тернарной операции в C++ "условие" ? "выражение 1" : "выражение 2"; Если условие истинно, то выполняется выражение 1, иначе (условие ложно) выполняется выражение 2. Пример:

1

a > b ? cout << a : cout << b; // если а > b, то выполняется cout << a, иначе выполняется cout << b

Таким образом, если, а > b напечатать а, иначе напечатать b. То есть, программа печатает большее из чисел. Использование условной операции может в некоторых случаях упрощать код, тогда как воспользоваться оператором if else таким же образом не возможно. Вернёмся к старой задаче из раздела Оператор выбора if else, напомню условие данной задачи.

104 Операция увеличения осуществляет следующее простое действие: она увеличивает значение своего операнда на единицу. Существуют две возможности использования данной операции, первая: когда символы ++ находятся слева от переменной (операнда), - "префиксная" форма, и вторая: когда символы ++ стоят справа от переменной, - "постфиксная" форма. Эти две формы указанной операции различаются между собой только тем, в какой момент осуществляется увеличение операнда. Сначала мы обсудим сходство указанных двух форм, /*выполнение сложения */ main( ) /*увеличение префиксная и постфиксная формы */ { int ultra = 0, super = 0; while (super < 6) {  super++; ++ultra; printf(" super = %d, ultra = %d\n", super, ultra); } }

105 Операция простого присваивания используется для замены значения левого операнда, значением правого операнда. При присваивании производится преобразование типа правого операнда к типу левого операнда по правилам, упомянутым раньше. Левый операнд должен быть модифицируемым.

Пример:

int t;

char f;

long z;

t=f+z;

Значение переменной f преобразуется к типу long, вычисляется f+z ,результат преобразуется к типу int и затем присваивается переменной t.

106 Кроме простого присваивания, имеется целая группа операций присваивания, которые объединяют простое присваивание с одной из бинарных операций. Такие операции называются составными операциями присваивания и имеют вид:

(операнд-1) (бинарная операция) = (операнд-2) .

Составное присваивание по результату эквивалентно следующему простому присваиванию:

(операнд-1) = (операнд-1) (бинарное операция) (операнд-2) .

Отметим, что выражение составного присваивания с точки зрения реализации не эквивалентно простому присваиванию, так как в последнем операнд-1 вычисляется дважды.

Каждая операция составного присваивания выполняет преобразования, которые осуществляются соответствующей бинарной операцией. Левым операндом операций (+=) (-=) может быть указатель, в то время как правый операнд должен быть целым числом.

Примеры:

double arr[4]={ 2.0, 3.3, 5.2, 7.5 } ;

double b=3.0;

b+=arr[2]; /* эквивалентно b=b+arr[2] */

arr[3]/=b+1; /* эквивалентно arr[3]=arr[3]/(b+1) */

Заметим, что при втором присваивании использование составного присваивания дает более заметный выигрыш во времени выполнения, так как левый операнд является индексным выражением.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]