Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Логические операции с двоичными кодами




Над двоичными кодами могут выполняться различные логические операции, среди которых особое место занимают:

- логическое суммирование (обозначения - ИЛИ, ОR, «Ú»);

-

_ «х», (т.е. штрих над
логическое умножение (обозначения - И, AND, «Ù»;

-

- логическое отрицание обозначения - НЕТ, NOT, . отрицаемым кодом х);
суммирование по модулю 2 (обозначается mod 2, «Å»);

- операции сдвига.

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

Пример:

10001101 ^ 11110000 = 11111101.

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

Пример:

10001101 Ù 11110000 = 10000000

Операция суммирования по модулю 2 выполняется над двумя кодами и генерирует код той же разрядности, что и операнды, у которого в некотором i-м разряде находится единица, если два заданных операнда в i-м разряде имеется противоположные значения. Иногда эта операция называется «исключающее ИЛИ».

Пример

10001101 Å 11110000 = 01111101.

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

Операции сдвига в свою очередь, подразделяются на:

- логические сдвиги, которые имеют разновидности - сдвиг вправо, сдвиг влево, циклический сдвиг вправо, циклический сдвиг влево;

- арифметический сдвиги вправо и в лево, выполнение которого зависит от знака и кода сдвигаемого числа.

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

Сдвиг влево выполняется за счет установки в разряд значения, соответствующего исходному значению в ближайшем младшем разряде (освобождающийся самый правый т.е. самый младший, разряд заполняется 0, а «выталкиваемый» разряд пропадает). Например, код 11001110 после сдвига влево будет иметь вид 10011100.

Сдвиг вправо выполняется за счет установки в разряд значения, соответствующего исходному значению в ближайшем старшем разряде (в освобождающийся самый левый, т.е. самый старший, разряд заполняется 0, «выталкиваемый» разряд пропадает). Например, код 11001110 после сдвига влево будет иметь вид 01100111.

Циклический сдвиг влево - выполняется за счет установки в разряд значения, соответствующего исходному значению в ближайшем младшем разряде (в освобождающийся самый правый, т.е. самый младший, разряд заносится значение старшего, т.е. самого левого разряда исходного кода). Например, код 11001110 после сдвига влево будет иметь вид 10011101.

Циклический сдвиг вправо - выполняется за счет установки в разряд значения, соответствующего исходному значению в ближайшем старшем разряде (в освобождающийся самый левый т.е. самый старший, разряд заполняется значение в самом младшем разряде исходного кода). Например, код 11001110 после сдвига влево будет иметь вид 01100111.

Арифметический сдвиг

Арифметические сдвиги обеспечивают выполнения умножения (сдвиги влево) или операции деления (сдвиги вправо) двоичных кодов на два, точно так же, как сдвиги вправо и влево десятичного числа обеспечиваю выполнение деления и умножение на 10.

Арифметические сдвиги влево двоичного прямого кода выполняются в зависимости от того, какое сдвигается число - положительное или отрицательное.

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

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

Примеры

1.Найти результат арифметического сдвига влево на три разряда двоичного прямого кода числа [А]пк= 00. 00000101

Решение

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

первый сдвиг: 00. 00000101à 00. 00001010;

второй сдвиг: 00. 00001010à 00. 00010100;

третий сдвиг: 00. 00010100à 00. 00101000.

2. Найти результат арифметического сдвига влево на четыре разряда двоичного прямого кода числа [А]пк= 00. 00101000.

Решение

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

первый сдвиг: 00. 00000101à 00. 00001010;

второй сдвиг: 00. 00001010à 00. 00010100;

третий сдвиг: 00. 10100000à 01. 01000000.

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

3. Найти результат арифметического сдвига вправо на два разряда двоичного прямого кода числа [А]пк= 00. 00000110.

Решение

Процесс заданного сдвига дает следующие промежуточные и конечное значение:

первый сдвиг: 00. 00000110à 00. 00000011;

второй сдвиг: 00. 00000011à 00. 00000001;

После выполнения заданного количества сдвигов выполняется округление на основании последнего «вытолкнутого» разряда; в данном случае последний «вытолкнутый» разряд равен 1, поэтому конечный результат выполнения заданного сдвига будет равен

00.00000010.

4. Найти результат арифметического сдвига вправо на четыре разряда двоичного прямого кода числа [А]пк= 00. 00000110.

Решение

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

первый сдвиг: 00. 00000110à 00. 00000011;

второй сдвиг: 00. 00000011à 00. 00000001;

третий сдвиг: 00. 00000001à 00. 00000000,

после выполнения третьего сдвига будет выработан сигнал о получении нулевого результата. Оставшиеся сдвиги могут не выполняться.

 

Арифметические сдвиги отрицательных двоичных чисел, представленных в прямом коде

Арифметические сдвиги влево и вправо реализуются по-разному в зависимости как от знака числа, так и от используемого кода (прямого обратного, дополнительного).

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

Реализация этого типа сдвига иллюстрируется следующими примерами.

Пример 1

Выполнить арифметический сдвиг влево двоичного числа А = 11. 001010 (соответствует 10 10), представленного в модифицированном прямом коде.

Решение

Заданный сдвиг, имеющий своей целью получение результата, в два раза превышающего по абсолютному значению значение исходного кода, дает в результате 11.010100 (2010), которое получается за счет логического сдвига влево только модульной части исходного кода. Факт получения переполнения устанавливается по наличию единичного значения старшего разряда в сдвигаемом коде перед очередным сдвигом.

Пример 2

Выполнить арифметический сдвиг вправо двоичного числа А = 11. 01110 (1410), представленного в модифицированном прямом коде.

Решение

Заданный сдвиг, имеющий своей целью получение кода, в два раза меньшего по абсолютному значению по отношению к значения исходного кода, дает в результате число 11.00111(710), которое получается за счет логического сдвига влево только модульной части исходного кода.

При арифметическом сдвиге влево отрицательного двоичного числа, представленного в обратном коде, осуществляется циклический сдвиг исходного кода с контролем за переполнением, например, сдвиг влево отрицательного двоичного числа 11.1100110(2510), представленного в обратном коде, дает в результате 11.1001101(5010).

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

Пример3

Выполнить сдвиг вправо на четыре разряда двоичного числа 11.1001101(десятичный эквивалент 5010), представленного в обратном коде.

Первый сдвиг дает 11.11001101(5010) à 11.11100110(2510).

Второй сдвиг дает 11.11100110(2510)à 11.11110011(1210).

Третий сдвиг дает 11.11110011(1210)à 11.11111001(610).

Четвертый сдвиг дает 11.11111001(610),.à 11.11111100(310).

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

После выполнения последнего, четвертого сдвига выполняется округление, при котором, если последний «вытолкнутый» разряд имел значение 0, к результату последнего сдвига прибавляется -1. Данное округление можно выполнить за счет прибавления единицы к прямому коду, соответствующему результату последнего сдвига исходного обратного кода.

В рассмотренном примере корректировать на единицу результат четвертого сдвига не надо, так как «вытолкнутый» разряд при последнем (четвертом) сдвиге равен единице. В данном случае конечный результат сдвига заданного отрицательного числа, представленного в обратном коде, равен 11.11111100.

При арифметическом сдвиге влево отрицательного двоичного числа, представленного в дополнительном коде, осуществляется логический сдвиг влево модуля исходного кода (освобождающийся разряд заполняется нулем) с контролем за переполнением, например, сдвиг влево отрицательного двоичного числа 11.11001110(5010), представленного в дополнительном коде, дает в результате 11.10011100 (10010).

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

Пример

Выполнить сдвиг вправо на четыре разряда двоичного числа 11.11001110 (десятичный эквивалент 5010), представленного в дополнительном коде.

Решение

Первый сдвиг дает 11.11001110à 11.11100111(2510),

Второй сдвиг дает 11.11100111à 11.11110011(1310),

Третий сдвиг дает 11.11110011à 11.11111001(710),

Четвертый сдвиг дает 11.11111001à 11.11111100(410).

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

Арифметический сдвиг вправо может выполняться над отрицательными числами с переполнением (такие числа в модифицированном прямом, обратном или дополнительном коде имеют в знаковом поле 10). В этом случае после сдвига в знаковом поле будет 11, а в старшем разряде – 0, если число представлено в обратном или дополнительном коде, или 1, если число представлено в прямом коде.

Пример1

Выполнить сдвиг вправо на 2 разряда число [А]пк= 10. 01000110 (А10=-326).

Решение

1-й сдвиг: 10. 01000110 à11.10100011 (-163);

2-й сдвиг: 11.10100011à11.01010001 (- 8110 и последний вытолкнутый разряд равен 1).

Окончательный результат с учетом округления имеем [А 22]пк=11.10010010.

Пример2

Выполнить сдвиг вправо на 2 разряда число [А]ок= 10. 10111001 (А10=-326).

Решение

1-й сдвиг: 10. 10111001 à11.01011100 (-163);

2-й сдвиг: 11.01011100 à11. 10101110 (- 8210).

Пример3

Выполнить сдвиг вправо на 2 разряда число [А]ок= 10. 10111010 (А10=-326).

Решение

1-й сдвиг: 10. 10111010 à11.01011101 (-163);

2-й сдвиг: 11. 01011101 à11. 10101110 (- 81 и последний вытолкнутый разряд равен 1).

Окончательный результат с учетом округления имеем [А 22]ок=

=11. 10101101.

 




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


Дата добавления: 2014-01-07; Просмотров: 5808; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.044 сек.