Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Поразрядные логические операции




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

Их распространенное применение – обработка информации в регистрах, области системных данных компьютера, различных его устройствах (когда, в силу ограниченности пропускной способности каналов, информация упаковывается в байт, слово и пр., а также – кодируется некоторым образом). Использование данных операций поможет проверить или установить значения определенных битов или групп битов для переменных типов char, short, int, long, которые в данном контексте могут рассматриваться в качестве массивов.

 

операция содержание
~ поразрядное отрицание (поразрядная инверсия, дополнение до 1)
&        и 1 во всех разрядах, где у операндов 1
|          или 1 во всех разрядах, где один или второй операнды имеют 1
^  исключающее или 1 во всех разрядах, где операнды имеют разные двоичные значения

 

 

!!!Обратите внимание, что поразрядные логические операции  определены в C++ только для целочисленных типов и выражений, приводимых к целому типу.

Результат поразрядной логической операции – целое число.

Биты результата формируются из битов операндов поразрядно, но по тем же правилам, что и для логических операций. Только операндами и результатами вместо true является 1, а вместо false – 0. Операции выполняются слева направо, кроме операции поразрядного отрицания.

Значения поразрядных логических операций

 

 

A

 

B

результат поразрядных операций

~ A & | ^
0 0 1 0 0 0
0 1 1 0 1 1
1 0 0 0 1 1
1 1 0 1 1 0

-----------------------------------------------------------------------------------------

Поразрядное логическое умножение

12 & 22 будет равно 4, так как:

           1210 = С16 =                     000011002 (для типа char)

                                                     &

2210  = 1616 =                    00010110 2

                                         000001002 = 410

-----------------------------------------------------------------------------------------

Поразрядное логическое сложение

12 | 22 будет равно 30, так как:

           1210 = С16  =         000011002 (для типа char)

(поразрядное сложение - or) +      

2210 = 1616 =          000101102

                                __________

                                000111102 = 1* 24 +1*23+ 1*22+ 1* 21 =3010;

-----------------------------------------------------------------------------------------

Сложение по модулю 2 (исключающее или)

12 ^ 22 будет равно 26, так как:

           1210 = С16  =         000011002 (для типа char)

      (операция ^) 

2210  = 1616  =          000101102

                                __________

                                000110102 = 1* 24 +1*23+ 1* 21 =2610;

-----------------------------------------------------------------------------------------

Логический сдвиг

2 << 7 будет равно 256, так как:

                                   210 = 00000000 000000102 (для типа unsigned short)

сдвиг влево на 7 битов этого числа дает перенос 1 на 7 битов влево:

                                 00000001 000000002 = 1 * 28 = 256;

 

256 >>  6 будет равно 4, так как:

                     25610 = 00000001 000000002       (для типа unsigned short)

сдвиг вправо на 6 битов этого числа дает перенос 1 на 6 битов вправо:

                                 00000000 000001002 = 410;

-----------------------------------------------------------------------------------------

С помощью поразрядной логической операции & можно проверить наличие единицы в любом разряде:

проверить наличие единицы в бите №4 переменной х типа char поможет логическое выражение: (х & 16) == 16;

проверить наличие единицы в битах №4, №2, №1 переменной х типа char поможет логическое выражение: (х & 22) == 22;

-----------------------------------------------------------------------------------------

С помощью поразрядной логической операции & можно «выключить» значение любого бита:

выключить бит №2 переменной х типа char (при неизменном значении других битов) поможет логическое выражение: х & 251 (255 – это единицы во всех разрядах, логическое выражение (х & 255) – оставит без изменения значения всех битов, бит 2 имеет значение 4, х & (255-4) – обнулит только бит номер 2;

-----------------------------------------------------------------------------------------

С помощью поразрядной логической операции | можно «включить» значение любого бита:

включить бит №2 переменной х типа char (при неизменном значении других битов) поможет логическое выражение: х | 4;

включить биты №4, №2, №1, №0 переменной х типа char (при неизменном значении других битов) поможет логическое выражение: х | 23;

-----------------------------------------------------------------------------------------

 Операция Y = X & 15 или ее аналог Y = X & $F – выделяет 4 младших разряда переменной Х (типа char), т.к. $F = 15 = 00001111. Старшие разряды обнуляются независимо от их значения, младшие – сохраняются.

!!! С помощью операции сдвига и операции % можно выделить заданное количество К средних битов числа:

// функция HF() возвращает средние биты от K-го до L-го (K < L) значения key int HF(int key, int K, int L);{ key >>= K;                         //отбросить K младших битов, от 0 до K-1 return key % int(pow(2.0, L-K+1))//вернуть из числа key  L-K+1 младших битов}

-----------------------------------------------------------------------------------------

Организация циклов

Понятие цикла

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

Тело цикла – последовательность инструкций, предназначенная для многократного исполнения. Единичное выполнение тела цикла называется итерацией.

Выражение, определяющее будет ли в очередной раз выполняться итерация, или цикл завершится, называется условием окончания цикла (условием выхода либо условием продолжения, в зависимости от того, как интерпретируется истинность выражения – как признак завершения или продолжения цикла). В выражении задействована переменная, называемая параметром (переменной) цикла, в отдельных случаях – счетчиком итераций цикла или просто счётчиком цикла. Цикл не обязательно содержит счётчик, счётчик не обязан быть один — условие выхода из цикла может зависеть от нескольких, изменяемых в цикле, переменных, а может определяться внешними условиями (например, наступлением определённого времени), в последнем случае счётчик может вообще не понадобиться.

Исполнение любого цикла включает: первоначальную инициализацию переменных цикла, проверку условия выхода из цикла, исполнение тела цикла и модификацию переменной цикла на каждой итерации. Кроме того, большинство языков программирования предоставляют дополнительные средства для управления циклом, например, операторы досрочного завершения цикла, то есть выхода из цикла независимо от истинности условия выхода (в Си++ – break) и операторы пропуска итерации (в Си++ – continue).

-----------------------------------------------------------------------------------------

Операторы цикла в С++:

В С++ определены операторы цикла:

§ цикл с предусловием while:

      while (выражение-условие)

     тело_цикла;

§ цикл с постусловием do-while:

do

тело_цикла;

while (выражение-условие)         

§ цикл со счетчиком  for:

for (инициализация; выражение-условие; модификация)

                                               тело цикла;

тело цикла – это либо отдельный (в том числе пустой) оператор, либо составной оператор, заключаемый в фигурные скобки; тело цикла может содержать вложенные циклы, условия;

выражение-условие – скалярное выражение (чаще всего логическое или арифметическое), определяющее условие продолжения выполнения итераций (если его значение true, т.е. не равно нулю).

Чтобы цикл имел шанс завершиться, содержимое тела цикла должно обязательно влиять на выражение-условие;

Прекращение выполнения цикла возможно в случаях:

§ ложное (нулевое) значение проверяемого выражения-условия;

§ выполнение в теле цикла оператора передачи управления за пределы цикла;

 

-----------------------------------------------------------------------------------------

Цикл с предусловием

Оператор цикла с предусловием while – является самой универсальной управляющей конструкцией. С его помощью можно записать любое циклическое действие.

Выражение while (выражение-условие) называется заголовком цикла. При входе в цикл вычисляется выражение-условие для параметра цикла. Если это значение, приведенное к логическому типу, равно false, то тело цикла не выполняется, т.е. происходит переход к выполнению следующего за циклом оператора программы. Если же значение условия, приведенное к логическому типу, равно true, то происходит вход в цикл и однократное выполнение операторов его тела. Поэтому для начала работы цикла перед ним в обязательном порядке необходимо инициализировать параметр цикла  «правильным» начальным  значением, иначе цикл может ни разу и не выполниться.

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

Как только выполнены все операторы тела цикла, управление снова передается на заголовок цикла, т.е. снова вычисляется значение выражения-условия и выполняется его анализ. Если значение выражения-условия все еще равно true (что зависит от модификации значений параметра цикла в теле цикла во время предыдущей итерации), то тело цикла выполняется еще один раз, и так далее. Как только очередное вычисление выражения-условия цикла дает значение false, работа цикла завершается.

 

Запишем вычисление аn  в виде функции pow_my():

 

Int pow_my (int a, int n)

{

int p=1, k=n;

while (k>0)

       {p *=a; k--;}

return p;

}

 

С помощью while можно организовать бесконечный цикл: while (true) …..

-----------------------------------------------------------------------------------------

Цикл с постусловием

Оператор цикла с постусловием do-while – является не столь универсальным, как оператор while, поскольку его выражение-условие располагается в конце цикла, и операторы его тела будут, в отличие от цикла while, всегда выполняться как минимум один раз. Это означает, что оператор не годится для записи цикла, тело которого при определенном условии вообще не должно выполняться.





Поделиться с друзьями:


Дата добавления: 2018-10-15; Мы поможем в написании ваших работ!; просмотров: 3134 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Что разум человека может постигнуть и во что он может поверить, того он способен достичь © Наполеон Хилл
==> читать все изречения...

3037 - | 2890 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.012 с.