Описать математические действия с двоичными числами. Арифметические операции над двоичными числами

Для того чтобы вычислить, какое количество информации содержится в закодированном сообщении, нужно умножить число знаков в этом сообщении на количество бит информации, необходимое для кодирования одного знака. Формулу для подсчета количества информации разработали Ральф Хартли (рис. 2) и Клод Шеннон (рис. 3), выдающиеся ученые и изобретатели, которые внесли значимый вклад в теорию информации.

Формула, которую предложил Хартли в 1928 г., имеет вид:

I = log 2 K ,

где K - количество возможных равновероятных событий, I - количество информации.

Иногда формулу записывают по-другому:

I = log 2 K = log 2 (1 / p) = -log 2 p,

где p - вероятность наступления каждого из K возможных событий, p = 1 / К , тогда К = 1 / р .

Рис. 2. Ральф Хартли ()

Если события не являются равновероятными, в таком случае используется формула, которую предложил Шеннон в 1948 году.

Рис. 3. Клод Шеннон ()

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

Мощность алфавита - это полное число символов, из которых состоит алфавит. Чем больше мощность алфавита, тем больше информации содержит один знак.

Например, молекула ДНК состоит из четырех элементов (нуклеотидов), которые составляют алфавит генетического кода. Вычислим по формуле информационный вес одного знака этого алфавита.

Рассмотрим еще один пример. В русском алфавите 32 буквы (если считать, что е = ё).

Каждая буква несет информацию 5 бит.


Рис. 4. Кодировка ASCII ()

Сегодня используются различные способы кодирования информации. Стандартная система кодов для представления букв, цифр и знаков называется ASCII («американский стандартный код для обмена информацией»). Поскольку вес стандартного символа = 8 бит, с помощью этой системы можно закодировать максимум 256 символов. Символы 0-127 интернациональны - это знаки препинания, цифры, буквы латинского алфавита (рис. 4). Символы 128-255 национальны, набор символов может отличаться в зависимости от выбранного языка. На рис. 5 вы можете увидеть таблицу символов для кодировки КОИ-8, которая была разработана для кодирования букв кириллицы.


Рис. 5. Кодировка КОИ-8 ()

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

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

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

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

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

Список литературы

1. Соловьева Л.Ф. Информатика и ИКТ. Учебник для 8 класса. - Спб: БХВ-Петербург, 2011.

2. Босова Л.Л., Босова А.Ю. Информатика и ИКТ. Учебник для 8 класса. - М.: Бином. Лаборатория знаний, 2013.

3. Угринович Н.Д. Информатика и ИКТ. 8 класс. - М.: Бином, 2013.

4. Горячев А.В., Макарина Л.А. и др. Информатика. 8 класс. В 2 кн. - М.: Баласс, 2013.

1. Интернет портал «Информатика» ()

2. Интернет портал «Информатика» ()

3. Интернет портал «Информатика» ()

Д омашнее задание

1. Глава 1, § 1.4. Босова Л.Л., Босова А.Ю. Информатика и ИКТ: Учебник для 8 класса. - М.: Бином. Лаборатория знаний, 2013.

2. По каким правилам выполняются арифметические действия над двоичными числами?

3. Измерьте информационную емкость слова «Информация».

4. Назовите основные системы кодировки текстовой информации.

5. Чем отличается аналоговый звук от дискретного?

Сложение двоичных чисел без знака

Микропроцессор выполняет сложение операндов по правилам сложения двоичных чисел. Проблем не возникает до тех пор, пока значение результата не превышает размерности поля операнда. Например, при сложении операндов размером в байт результат не должен превышать число 255. Если это происходит, то результат оказывается неверным. Рассмотрим, почему так происходит.

К примеру, выполним сложение: 254 + 5 = 259 в двоичном виде. 11111110 + 0000101 = 1 00000011. Результат вышел за пределы 8 бит и правильное его значение укладывается в 9 бит, а в 8-битовом поле операнда осталось значение 3, что, конечно, неверно. В микропроцессоре этот исход сложения прогнозируется и предусмотрены специальные средства для фиксирования подобных ситуаций и их обработки. Так, для фиксирования ситуации выхода за разрядную сетку результата, как в данном случае, предназначен флаг переноса cf. Он располагается в бите 0 регистра флагов EFLAGS/FLAGS. Именно установкой этого флага фиксируется факт переноса единицы из старшего разряда операнда. Естественно, что программист должен учитывать возможность такого исхода операции сложения и предусматривать средства для корректировки. Это предполагает включение участков кода после операции сложения, в которых анализируется флаг cf. Анализ этого флага можно провести различными способами.

Самый простой и доступный – использовать команду условного перехода jcc. Эта команда в качестве операнда имеет имя метки в текущем сегменте кода. Переход на эту метку осуществляется в случае, если в результате работы предыдущей команды флаг cf установился в 1. В системе команд микропроцессора имеются три команды двоичного сложения:

1) inc операнд – операция инкремента, т. е. увеличения значения операнда на 1;

2) add операнд_1, операнд_2 – команда сложения с принципом действия: операнд_1 = операнд_1 + операнд_2;

3) adc операнд_1, операнд_2 – команда сложения с учетом флага переноса cf. Принцип действия команды: операнд_1 = операнд_1 + операнд_2 + значение_сГ.

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


Сложение двоичных чисел со знаком

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

1) флаг переноса cf, установка которого в 1 говорит о том, что произошел выход за пределы разрядности операндов;

2) команду adc, которая учитывает возможность такого выхода (перенос из младшего разряда).

Другое средство – это регистрация состояния старшего (знакового) разряда операнда, которое осуществляется с помощью флага переполнения of в регистре EFLAGS (бит 11).

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


30566 = 0111011101100110

00687 = 00000010 10101111

31253 = 01111010 00010101

Следим за переносами из 14 и 15-го разрядов и правильностью результата: переносов нет, результат правильный.


30566 = 0111011101100110

30566 = 0111011101100110

1132 = 11101110 11001100

Произошел перенос из 14-го разряда; из 15-го разряда переноса нет. Результат неправильный, так как имеется переполнение – значение числа получилось больше, чем то, которое может иметь 16-битное число со знаком (+32 767).


–30566 = 10001000 10011010

–04875 = 11101100 11110101

–35441 = 01110101 10001111

Произошел перенос из 15-го разряда, из 14-го разряда нет переноса. Результат неправильный, так как вместо отрицательного числа получилось положительное (в старшем бите находится 0).


–4875 = 11101100 11110101

–4875 = 11101100 11110101

09750 = 11011001 11101010

Есть переносы из 14 и 15-го разрядов. Результат правильный.


Таким образом, мы исследовали все случаи и выяснили, что ситуация переполнения (установка флага OF в 1) происходит при переносе:

1) из 14-го разряда (для положительных чисел со знаком);

2) из 15-го разряда (для отрицательных чисел).

И наоборот, переполнения не происходит (т. е. флаг OF сбрасывается в 0), если есть перенос из обоих разрядов или перенос отсутствует в обоих разрядах.

Итак, переполнение регистрируется с помощью флага переполнения of. Дополнительно к флагу of при переносе из старшего разряда устанавливается в 1 и флаг переноса CF Так как микропроцессор не знает о существовании чисел со знаком и без знака, то вся ответственность за правильность действий с получившимися числами ложится на программиста. Проанализировать флаги CF и OF можно командами условного перехода JC\JNC и JO\JNO соответственно.

Что же касается команд сложения чисел со знаком, то они те же, что и для чисел без знака.


Вычитание двоичных чисел без знака

Как и при анализе операции сложения, порассуждаем над сутью процессов, происходящих при выполнении операции вычитания. Если уменьшаемое больше вычитаемого, то проблем нет, – разность положительна, результат верен. Если уменьшаемое меньше вычитаемого, возникает проблема: результат меньше 0, а это уже число со знаком. В этом случае результат необходимо завернуть. Что это означает? При обычном вычитании (в столбик) делают заем 1 из старшего разряда. Микропроцессор поступает аналогично, т. е. занимает 1 из разряда, следующего за старшим, в разрядной сетке операнда. Поясним на примере.


05 = 00000000 00000101

–10 = 00000000 00001010

Для того чтобы произвести вычитание, произведем

воображаемый заем из старшего разряда:

100000000 00000101

00000000 00001010

11111111 11111011

Тем самым, по сути, выполняется действие

(65 536 + 5) – 10 = 65 531

0 здесь как бы эквивалентен числу 65536. Результат, конечно, неверен, но микропроцессор считает, что все нормально, хотя факт заема единицы он фиксирует установкой флага переноса cf. Но посмотрите еще раз внимательно на результат операции вычитания. Это же -5 в дополнительном коде! Проведем эксперимент: представим разность в виде суммы 5 + (-10).


5 = 00000000 00000101

(-10)= 11111111 11110110

11111111 11111011

т. е. мы получили тот же результат, что и в предыдущем примере.

Таким образом, после команды вычитания чисел без знака нужно анализировать состояние флага СЕ Если он установлен в 1, то это говорит о том, что произошел заем из старшего разряда и результат получился в дополнительном коде.

Аналогично командам сложения группа команд вычитания состоит из минимально возможного набора. Эти команды выполняют вычитание по алгоритмам, которые мы сейчас рассматриваем, а учет особых ситуаций должен производиться самим программистом. К командам вычитания относятся следующие:

2) sub операнд_1, операнд_2 – команда вычитания; ее принцип действия: операнд_1 = операнд_1 – операнд_2;

3) sbb операнд_1, операнд_2 – команда вычитания с учетом заема (флага ci): операнд_1 = операнд_1 – операнд_2 – значение_сГ.

Как видите, среди команд вычитания есть команда sbb, учитывающая флаг переноса cf. Эта команда подобна adc, но теперь уже флаг cf исполняет роль индикатора заема 1 из старшего разряда при вычитании чисел.


Вычитание двоичных чисел со знаком

Здесь все несколько сложнее. Микропроцессору незачем иметь два устройства – сложения и вычитания. Достаточно наличия только одного – устройства сложения. Но для вычитания способом сложения чисел со знаком в дополнительном коде необходимо представлять оба операнда – и уменьшаемое, и вычитаемое. Результат тоже нужно рассматривать как значение в дополнительном коде. Но здесь возникают сложности. Прежде всего они связаны с тем, что старший бит операнда рассматривается как знаковый. Рассмотрим пример вычитания 45 – (-127).


Вычитание чисел со знаком 1

–127 = 1000 0001

–44 = 1010 1100

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


Вычитание чисел со знаком 2

–45–45 = -45 + (-45)= -90.

–45 = 11010011

–45 = 11010011

–90 = 1010 0110

Здесь все нормально, флаг переполнения of сброшен в 0, а 1 в знаковом разряде говорит о том, что значение результата – число в дополнительном коде.


Вычитание и сложение операндов большой размерности

Если вы заметили, команды сложения и вычитания работают с операндами фиксированной размерности: 8, 16, 32 бит. А что делать, если нужно сложить числа большей размерности, например 48 бит, используя 16-разрядные операнды? К примеру, сложим два 48-разрядных числа:

Рис. 29. Сложение операндов большой размерности


На рисунке 29 по шагам показана технология сложения длинных чисел. Видно, что процесс сложения многобайтных чисел происходит так же, как и при сложении двух чисел «в столбик», – с осуществлением при необходимости переноса 1 в старший разряд. Если нам удастся запрограммировать этот процесс, то мы значительно расширим диапазон двоичных чисел, над которыми мы сможем выполнять операции сложения и вычитания.

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

В завершение обсуждения команд сложения и вычитания отметим, что кроме флагов cf и of в регистре eflags есть еще несколько флагов, которые можно использовать с двоичными арифметическими командами. Речь идет о следующих флагах:

1) zf – флаг нуля, который устанавливается в 1, если результат операции равен 0, и в 1, если результат не равен 0;

2) sf – флаг знака, значение которого после арифметических операций (и не только) совпадает со значением старшего бита результата, т. е. с битом 7, 15 или 31. Таким образом, этот флаг можно использовать для операций над числами со знаком.


Умножение чисел без знака

Для умножения чисел без знака предназначена команда

mul сомножитель_1

Как видите, в команде указан всего лишь один операнд-сомножитель. Второй операнд-сомножитель_2 задан неявно. Его местоположение фиксировано и зависит от размера сомножителей. Так как в общем случае результат умножения больше, чем любой из его сомножителей, то его размер и местоположение должны быть тоже определены однозначно. Варианты размеров сомножителей и размещения второго операнда и результата приведены в таблице 10.

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

Просуммируем числа A=12 и B=5. Для выполнения этой операции в АЛУ надо со входов мультиплексоров передать числа A и B без изменения в сумматор, на выходе S, которого получим результат.

В результате суммирования получается правильный результат. Это можно проконтролировать по старшему разряду знака (флагу переноса C), который совпадает со вторым знаковым разрядом (знаком результата).

Просуммируем числа 100 и 31

В этом примере видно, что в результате суммирования произошло переполнение восьмибитовой переменной, т.к. в результате операции над положительными числами получился отрицательный результат. Однако если рассмотреть флаг переноса, то он не совпадает со знаком результата. Эта ситуации является признаком переполнения результата и легко обнаруживается при помощи операции "исключающее ИЛИ" над старшим битом результата и флагом переноса C. Большинство процессоров осуществляют эту операцию аппаратно и помещают результат во флаг переполнения OV.

1.2. Сложение отрицательных двоичных чисел выполняетсяв дополнительном коде. В нем операции с отрицательными числами выполняются аналогично операциям с положительными числами.

Просуммируем два отрицательных числа -12 и -5. Чтобы представить отрицательное число в дополнительном коде, надо представить его в прямом коде с нулевыми знаковыми разрядами как в предыдущем примере. После этого надо инвертировать все разряды кода и прибавить единицу младшего разряда. Получим значения A и B, приведенные ниже и просуммируем их.

В примере флаг переноса C тоже совпадает со знаком результата, то есть переполнения не произошло и в этом случае.

1.3. Сложение положительного и отрицательного двоичных чисел ничем не отличается от предыдущих операций. Просуммируем положительное и отрицательное число -12 и +5.

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

2. Сумматоры

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

Рис. 1. Обозначение сумматора на функциональных схемах

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

На основе сумматоров строятся арифметико-логические устройства (АЛУ).



glavpom.ru - Подстанции. Силовая электроника. Экология. Электротехника