Тарифы Услуги Сим-карты

Числа в двоично десятичной системе счисления. Двоично-десятичная система. Арифметические действия над числами с плавающей запятой

Здравствуйте, Хабросообщество!

На хабре есть описание множества интересных структур данных, таких как деревья отрезков, дуча и т.п. Если Вам интересны сложные структуры данных, то добро пожаловать под кат! В своем цикле статей я рассмотрю разные виды куч и способы их применения на практике:
1) Биномиальную кучу
2) Левую кучу
3) Фибоначчиеву кучу
4) Применение этих структур данных на практике

Постановка задачи:
Построить структуру данных, в которой будет храниться множество наших объектов (разных в зависимости от задачи), у каждого объекта будет поле ключ, по которому мы быстро сможем находить минимальный элемент. Для этой структуры должны бать возможны операции:
Make – создание новой пустой кучи,
Insert – вставка нового элемента в кучу,
Minimum – минимальный ключ,
ExtractMin – извлечение минимума,
Merge – слияние 2-х куч,
Decrease – уменьшение ключа,
Delete – удаление объекта.

Многие знакомы с простейшими способами реализации этой структуры, такими как массив:) и двоичная куча. На них я не буду подробно останавливаться ввиду их простоты и общеизвестности.

Как известно, для двоичной кучи асимптотика перечисленных выше операций такова:
Make – O(1)
Merge – O(N)
Insert – O(log N) – где N – количество элементов в куче.
Minimum – O(1)
ExtractMin – O(log N)
Decrease – O(log N)
Delete – O(log N)

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

Биномиальная куча
Биномиальная куча – это множество биномиальных деревьев с некоторыми ограничениями. Мы их введем чуть позже.

Биномиальное дерево – дерево, которое задается рекуррентно:
B i – это B i – 1 , в котором левым сыном корня сделали дерево B i – 1 .
B 0 - это просто вершина.
Примеры для B 0 , B 2 , B 3:

У биномиального дерева(B k) есть ряд интересных свойств :
T.1. 2 k вершин
T.2. Высота дерева k
T.3. C i k вершин глубины i (вот почему они называются биномиальными: C i k биномиальный коэффициент).
T.4. Дети корня – это B, B k – 2 , …, B 0 – именно в этом порядке.
T.5. Максимальная высота вершины в биномиальном дереве O(log N)
Доказываются свойства по индукции. Предлагаю читателям самим провести доказательство, для лучшего понимания деревьев.

Итак, теперь вернемся к биномиальным кучам . Биномиальная куча – множество биномиальных деревьев, со следующими ограничениями:
1) В каждом из биномиальных деревьев сохраняется свойство кучи.
2) Нет двух деревьев одинакового размера
3) Деревья упорядочены по размеру.

Поговорим о том, как биномиальная куча будет храниться в программе. Мы будем использовать метод “левый сын – правый брат”. Будем хранить корневой список(root_list , его длина root_list.length), в котором будут корни биномиальных деревьев, в порядке возрастания высоты. У каждой вершины будут следующие поля:
data – данные, которые хранятся в вершине(по ним мы и находим минимум)
right – правый брат
child – левый сын
degree – степень вершины(очевидно деревья в биномиальной куче упорядоченны по этому полю)

Сразу же заметим:
Свойство H.1:
Длина root_list.length = O(log N), где N - количество элементов в куче.
Для доказательства достаточно заметить, что из-за T.1, наличие дерева B k в двоичной записи числа.

Перейдем к описанию операций, которые можно проводить с биномиальными кучами:

Make
Задача : создать пустую кучу.
Алгоритм : создаем пустой список root_list .
Сложность : очевидно, время работы O(1).

Merge
Задача : объединить 2 кучи в 1.
Алгоритм : сначала объединим корневые списки куч в 1 корневой список, поддерживая упорядоченность по degree. Алгоритм аналогичен слиянию 2-х массивов в mergeSort:
Храним по указателю на начало списков и в результирующий список записываем минимальный из них, тот откуда только что записали сдвигаем на следующий. Далее проходимся от начала до конца нового полученного корневого списка и сливаем деревья одинакового размера в 1. Могут быть случаи:
1) Только 2 дерева одинакового размера. Тогда объединяем их.
2) 3 дерева одинакового размера. Объединяем 2 последних.
При объединении двух деревьев нужно лишь посмотреть в корне какого из них меньший ключ и сделать другое дерево левым сыном корня этого дерева.

Пример, того, что получается после объединения двух куч:

Сложность : Время работы O(root_list1.length) + O(root_list2.length) = (по свойству H.1) = O(log N).
За один проход (O(log N)) мы получим объединенное биномиальное дерево. Получаем, что общая сложность O(log N).

Insert
Задача : вставить новый элемент в кучу.
Алгоритм : Создаем кучу из одного элемента и объединяем с нашей кучей.
Сложность : O(1) + O(log(N)) = O(log(N)).

Minimum
Задача : найти минимум в куче.
Алгоритм : очевидно, минимум находится в корневом списке, то есть, чтобы его найти нужно пройтись по корневому списку.
Сложность : O(root_list.length) = O(log(N)).

ExtractMin
Задача : удалить минимальный элемент.
Алгоритм : находим его при помощи Minimum . Удаляем его из корневого списка. Из перевернутого списка его детей делаем root_list для новой кучи (H 1) и объединяем исходную кучу с H 1 .
Сложность : так как каждая операция в извлечении минимума работает за O(log N): O(log N) + O(log N) + O(log N) = O(log N)

Decrease
Задача : уменьшить значение data в данной вершине.
Алгоритм : уменьшаем значение в вершине. Тогда свойство кучи будет возможно нарушено для нашей вершины и ее предка, тогда меняем их местами. Продолжаем процесс, пока наша вершина не “всплывет” на свое место. Алгоритм работает также, как аналогичный в двоичной куче.
Сложность : В худшем случае наша вершина будет всплывать до корня, то есть мы совершим O(log N) действий (вершина на каждом шаге “всплывает” на уровень выше, а высота биномиального дерева по T.5 O(log N))

Delete
Задача : удалить произвольный элемент.
Алгоритм : сначала уменьшим при помощи Decrease значение в вершине до минимально возможного. А затем удалим минимальный в куче (ExtractMin).
Сложность : O(log N) + O(log N) = O(log N)

Заключение.
Мы рассмотрели структуру данных биномиальная куча и доказали ее асимптотику.
В следующей статье на основе биномиальной кучи мы построим чуть более сложную структуру данных, а именно Фибоначчиеву кучу.

Поиграться с биномиальными кучами можно на rain.ifmo.ru/cat/view.php/vis/heaps/binomial-2001
Почитать более подробно можно в Т.Кормен «Алгоритмы: построение и анализ.».
Всем спасибо за внимание, и до новых встреч!

Память, которую используют программы, состоит из нескольких частей — сегментов :

Сегмент кода (или ещё «текстовый сегмент»), где находится скомпилированная программа. Обычно доступен только для чтения.

Сегмент bss (или ещё «неинициализированный сегмент данных»), где хранятся глобальные и , инициализированные нулём.

Сегмент данных (или ещё «сегмент инициализированных данных»), где хранятся инициализированные глобальные и статические переменные.

К уча , откуда выделяются динамические переменные.

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

В этом уроке мы рассмотрим только кучу и стек, поскольку всё самое интересное происходит именно здесь.

Куча

Сегмент кучи (или просто «куча ») отслеживает память, используемую для динамического выделения. Мы уже немного поговорили о куче в .

В C++, при использовании оператора new для выделения динамической памяти, эта память выделяется в сегменте кучи самой программы:

int *ptr = new int; // для ptr выделяется 4 байта из кучи int *array = new int; // для array выделяется 40 байт из кучи

Адрес выделяемой памяти передаётся обратно оператором new и затем он может быть сохранён в . О механизме хранения и выделения свободной памяти нам сейчас беспокоиться незачем. Однако стоит знать, что последовательные запросы памяти не всегда приводят к выделению последовательных адресов памяти!

int *ptr1 = new int; int *ptr2 = new int; // ptr1 и ptr2 могут не иметь последовательных адресов

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

Куча имеет свои преимущества и недостатки:

Выделение памяти в куче сравнительно медленное.

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

Доступ к динамически выделенной памяти осуществляется только через указатель. Разыменование указателя происходит медленнее, чем доступ к переменной напрямую.

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

Стек вызовов

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

Стек вызовов реализуется как структура данных «Стек». Поэтому, прежде чем мы поговорим о том, как работает стек вызовов, нам нужно понять, что такое стек как структура данных.

Стек как структура данных

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

Например, рассмотрим стопку (аналогия - стек) тарелок на столе. Поскольку каждая тарелка тяжёлая, а они ещё сложены друг на друге, то вы сможете сделать что-то одно из следующего:

Посмотреть на поверхность первой тарелки (которая находится на самом верху).

Взять верхнюю тарелку из стопки (обнажая таким образом следующую тарелку, которая находится под ней - если она вообще есть).

Положить новую тарелку поверх стопки (спрятав под ней самую верхнюю тарелку — если она вообще была).

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

Посмотреть на верхний элемент стека (используя функцию top () или peek () ).

Вытянуть верхний элемент стека (используя функцию pop () ).

Добавить новый элемент поверх стека (используя функцию push () ).

Стек - это структура данных типа LIFO (англ. «L ast I n, F irst O ut» - «Последним пришёл, первым ушёл»). Последний элемент, который будет находиться на вершине стека, первым и уйдёт из него. Если положить новую тарелку поверх других тарелок, то именно эту тарелку вы первой и возьмёте. По мере того, как элементы помещаются в стек - стек растёт, по мере того, как элементы удаляются со стека - стек уменьшается.

Например, рассмотрим коротенькую последовательность, показывающую, как работает добавление и удаление в стеке:

Stack: empty
Push 1
Stack: 1
Push 2
Stack: 1 2
Push 3
Stack: 1 2 3
Push 4
Stack: 1 2 3 4
Pop
Stack: 1 2 3
Pop
Stack: 1 2
Pop
Stack: 1

Стопка тарелок довольно-таки хорошая аналогия работы стека, но есть аналогия и получше. Например, рассмотрим несколько почтовых ящиков, которые расположены друг на друге. Каждый почтовый ящик может содержать только один элемент, и все почтовые ящики изначально пустые. Кроме того, каждый почтовый ящик прибивается гвоздём к почтовому ящику снизу, поэтому количество почтовых ящиков не может быть изменено. Если мы не можем изменить количество почтовых ящиков, то как мы получим поведение, подобное стеку?

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

Сегмент стека вызовов

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

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

Наша аналогия с почтовыми ящиками - это действительно то, как работает стек вызовов. Стек вызовов имеет фиксированное количество адресов памяти (фиксированный размер). Почтовые ящики являются адресами памяти, а «элементы», которые мы добавляем и вытягиваем из стека, называются фреймами (или еще «кадрами ») стека. Кадр стека отслеживает все данные, связанные с одним вызовом функции. «Наклейка» — это регистр (небольшая часть памяти в ЦП), который является указателем стека. Указатель стека отслеживает вершину стека вызовов.

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

Стек вызовов на практике

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

Программа сталкивается с вызовом функции.

Фрейм стека создаётся и помещается в стек. Он состоит из:

Адреса инструкции, который находится за вызовом функции (так называемый «обратный адрес »). Так процессор запоминает, куда возвращаться после выполнения функции.

Аргументов функции.

Памяти для локальных переменных.

Сохранённых копий всех регистров, модифицированных функцией, которые необходимо будет восстановить после того, как функция завершит своё выполнение.

Процессор переходит к точке начала выполнения функции.

Инструкции внутри функции начинают выполняться.

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

Регистры восстанавливаются из стека вызовов.

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

Обрабатывается возвращаемое значение.

ЦП возобновляет выполнение кода (исходя из обратного адреса).

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

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

Пример стека вызовов

Рассмотрим следующий фрагмент кода:

Стек вызовов этой программы выглядит следующим образом:

boo() (включая параметр b)
main()

Переполнение стека

Стек имеет ограниченный размер и, следовательно, может содержать только ограниченный объём информации. В Windows размер стека по умолчанию составляет 1 МБ. На некоторых других Unix-системах этот размер может достигать и 8 МБ. Если программа пытается поместить в стек слишком много информации, то это приведёт к переполнению стека. Переполнение стека (англ. «stack overflow» ) происходит, когда запрашиваемой памяти нет в наличии (вся память уже занята).

Переполнение стека является результатом добавления слишком большого количества переменных в стек и/или создания слишком большого количества вложенных вызовов функций (например, где функция A вызывает функцию B, которая, в свою очередь, вызывает функцию C, а та вызывает функцию D и т.д.). Переполнение стека обычно приводит к сбою в программе. Например:

int main() { int stack; return 0; }

int main ()

int stack [ 1000000000 ] ;

return 0 ;

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

Вот ещё одна программа, которая вызовет переполнение стека, но уже по другой причине:

void boo() { boo(); } int main() { boo(); return 0; }

КУЧА

1. Большое количество чего-нибудь, наваленное в одном месте горкой. Куча песку. «Навозну кучу разрывая, петух нашел жемчужное зерно.» Крылов . «Царь однажды воинам своим велел снести земли по горсти в кучу.» Пушкин . Куча листьев.

|| Беспорядочное нагромождение, груда разных предметов. В углу была свалена в кучу всякая рухлядь. Из горевшего дома выносили пожитки и клали в одну кучу.

❖ Валить всё в одну кучу (разг.) - перен. без разбора, огульно, смешивать в одно различные явления. Куча мала! - восклицание, употр. в детской игре, когда устраивается общая свалка.


Толковый словарь Ушакова . Д.Н. Ушаков. 1935-1940 .


Синонимы :

Смотреть что такое "КУЧА" в других словарях:

    Жен. груда, вброх, громада, вещи горой; | толпа, сборище; * много; | новг., твер. копна сена. | моск. количество скота, выгоняемого от одного хозяина в стадо. Саженные кучи щебня. Куча людей, народа. На мне куча забот. Муравьиная куча. муравейник … Толковый словарь Даля

    Ворох, громада, груда, горка, кипа, купа, сугроб; скирд, стог, омет. Тела лежали грудами. В этом селе избы стоят гнездами. Деревья стоят купами. Стог (скирд) сена. Кладь (одонье, одонья, зарод) хлеба. Омет соломы.. Ср. . См. возвышенность, ворох … Словарь синонимов

    КУЧА, и, жен. 1. Скопление чего н. сыпучего. К. песку. Сгрести сухие листья в кучу. 2. чего. Нагромождение чего н., множество кого чего н. К. книг. К. дел. К. денег (очень много). Толпа валит кучей. Куча мала! возглас в детской игре, по к рому… … Толковый словарь Ожегова

    куча - разг. КУЧА, груда, разг. ворох, разг. гора … Словарь-тезаурус синонимов русской речи

    куча - куча, гора, груда, кипа, ворох Стр. 0501 Стр. 0502 Стр. 0503 Стр. 0504 Стр. 0505 … Новый объяснительный словарь синонимов русского языка

    куча - груда штабель кипа (бумаг) пачка связка пакет — Тематики нефтегазовая промышленность Синонимы грудаштабелькипа (бумаг)пачкасвязкапакет EN pile … Справочник технического переводчика

    Горелая куча. Арх., Детск. То же, что куча мала. АОС 9, 341. Куча звёзд. Сиб. Созвездие Плеяд. ФСС, 102. Куча мала! Детск. Возглас в игре, являющийся сигналом к общей свалке. Ф 1, 273; ФСРЯ, 219; БТС, 483, 517. Куча с грудой. Арх. О большом… … Большой словарь русских поговорок

    Сущ., ж., употр. часто Морфология: (нет) чего? кучи, чему? куче, (вижу) что? кучу, чем? кучей, о чём? о куче; мн. что? кучи, (нет) чего? куч, чему? кучам, (вижу) что? кучи, чем? кучами, о чём? о кучах 1. Кучей каких либо вещей, материалов и т. п … Толковый словарь Дмитриева

    Куча - Большая или Ближняя (Дор), Шер (Шöр), Малая (Уудор) Куча прав, притоки Ижмы. Дл. соответственно 31 км, 33 км, 13 км. Гидроним Куча связан с рус. круча «крутой, обрывистый берег; высокий берег в излучине реки». Один из берегов Кучи возвышен,… … Топонимический словарь Республики Коми

    У этого термина существуют и другие значения, см. Куча (значения). Изображение жителей Кучи на фреске в Кизиле. Куча (также Кучэ и Кучар) древнее буддийское государ … Википедия

Книги

  • Куча (изд. 2015 г.) , Перец Маркиш. Перец Маркиш - еврейский поэт, драматург и романист. В его поэме `Куча`, впервые изданной на идише в 1922 году, излита горечь от увиденных последствий еврейских погромов на Украине в годы…
Сложение положительных чисел Сложение многоразрядных чисел осуществляется по правилам двоичной арифметики; особенность проявляется при сложении двух единиц. При S = Ю(10)сумма двух единиц равна двум, что эквивалентно 10(2). Таким образом, вместо одного разряда образуется два. В этом...
(Вычислительная техника)
  • Арифметические действия над числами с плавающей запятой
    Сложение чисел При сложении чисел с плавающей запятой результат определяется как сумма мантисс слагаемых с общим для слагаемых порядком. Если знаки обеих мантисс одинаковы, то они складываются в прямых кодах, если разные - в дополнительном или обратном кодах. В табл. 2.8 приведен порядок действий...
    (Вычислительная техника)
  • Числа в десятичной системе счисления
    10° - единица 109 - миллиард 1024 - септиллион 101 - десять 1012 - триллион 1027 - октиллион 102 - сто 1015 - квадриллион Ю30 - нониллион 103 - тысяча 1018 - квинтиллион 1033 - дециллион 106 - миллион 1021 - ...
    (Физика)
  • Системы счисления
    Человеку издревле приходилось считать различные предметы и записывать их количество. Для этих целей возникла унарная система записи, при которой числа обозначались соответствующим количеством черточек (или засечек). Например, число 5 представлялось как 111 |. Унарная запись очень громоздкая и...
    (Архитектура ЭВМ)
  • Экономичность системы счисления
    Число в системе счисления рек разрядами, очевидно, будет иметь наибольшее значение в том случае, если все цифры числа окажутся максимальными, т. е. равными - 1). Тогда (гр)тах =(/>-1)...(/>-!) = / -1. к цифр Количество разрядов числа при переходе от одной системы счисления...
    (Архитектура ЭВМ)
  • Корректура счисления пути по одной линии положения
    При подходе к побережью обстановка может сложиться так, что судоводитель имеет возможность получить только одну линию положения. Например, открылась вершина горы, на которую можно измерить только пеленг, или прослушиваются сигналы только одного радиомаяка. Такая же обстановка складывается и при определении...
    (Анализ и обработка навигационных измерений)
  • (Методическая разработка)

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

    Примечание: Правила умножения точно такие же, как и в десятичной системе счисления.

    Умножить: 5 × 5 = 25

    Преобразуем десятичное число 5 в двоичный код

    5: 2 = 2 остаток 1 Полученный результат

    2: 2 = 1 остаток 0 записываем в обратном

    1: 2 = 0 остаток 1 порядке

    Таким образом: 5 (10) = 101 (2)

    Преобразуем десятичное число 25 в двоичный код

    25: 2 = 12 остаток 1

    12: 2 = 6 остаток 0 Полученный результат

    6: 2 = 3 остаток 0 записываем в обратном

    3: 2 = 1 остаток 1 порядке

    1: 2 = 0 остаток 1

    Таким образом: 11001 (2) = 25 (10)

    Производим проверку:

    Производим двоичное умножение

    ×
    101
    +
    101

    Правила умножения в двоичной системе точно такие же, как и в десятичной системе счисления.

    1) 1 × 1, будет 1, записываем 1.

    2) 1 × 0, будет 0, записываем 0.

    3) 1 × 1, будет 1, записываем 1.

    4) Записываем три нуля, причем первый ноль под вторым знаком (нулем).

    5) Умножение 1 × 101 точно такое же, как и п.п. 1, 2, 3.

    Производим операцию сложения.

    6) Сносим и записываем 1.

    7) 0 +0 будет ноль, записываем 0.

    8) 1 + 1 будет 10, записываем ноль, а единицу переносим в старший разряд.

    9) 0 + 0 + 1 будет 1, записываем 1

    10) Сносим и записываем 1.

    Задание 1: Выполнить умножение в двоичной форме

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

    Примечание: Правила деления точно такие – же, как и в десятичной системе счисления.

    Если результат делится без остатка, записываем – 0, иначе (с остатком) – 1

    Разделить: 10:2 = 5

    Преобразуем десятичное число 10 в двоичный код:

    10:2 = 5 остаток 0 5:2 = 2 остаток 1 2:2 = 1 остаток 0 1:2 = 0 остаток 1

    Полученный результат

    записываем в обратном

    Таким образом: 1010 (2) = 10 (10)

    Преобразуем десятичное 2 в двоичный код

    2:2 = 1 остаток 0

    1:2 = 0 остаток 1



    Таким образом: 10 (2) = 2 (10)

    Преобразуем десятичное 5 в двоичное код

    5:2 = 2 остаток 1

    2:2 = 1 остаток 0

    1:2 = 0 остаток 1

    Таким образом: 101 (2) = 5 (10)

    Производим проверку:

    1010 (2) = 0×2 0 + 1×2 1 + 0×2 2 + 1×2 3 = 0 +2+0+8 =10 (10)

    10 (2) = 0×2 0 +1×2 1 = 0 +2 = 2 (10)

    101 (2) = 1×2 0 +0×2 1 +1×2 2 = 1+ 0+4 = 5 (10)

    Производим двоичное деление:

    1010 (2) : 10 (2) = 101 (2)

    1010 (2) 10
    10

    Правила деления в двоичной системе точно такие же, как и в десятичной.

    1) 10 разделить на 10. Берём по 1, в результат записываем 1.

    2) Сносим 1 (единицу), не хватает, занимаем 0 (ноль).

    3) Берём по 1. Из 10 (десяти) вычесть 10 получается ноль, что и соответствует
    действительности.

    Задание 1: Выполнить деление в двоичной форме

    1) 10010 (2) : 110 (2) =

    11000 (2) : 110 (2) =

    2) 110110 (2) : 110 (2) =

    Задание 2: Полученный результат восстановить в десятичной форме.

    Задание: Вычесть числа, выраженные в двоичной форме, полученный результат восстановить в десятичную форму.

    Вычесть: 1100 (2) – 110 (2) =

    Правила вычитания в двоичной форме.

    Вычитание в двоичной форме подобно вычитанию в десятичной системе.

    110 0 + 0 = 0

    110 0 + 1 = 1

    1) 0 плюс 0 равно 0 (См. правила сложения чисел).

    2) 1 плюс 1 равно 10. Записываем ноль, а единицу переносим в старший разряд, как и в десятичной системе

    3) 1 плюс 1 плюс 1 равно 11 – двоичное число. Записываем 1, а вторую единицу
    переносим в старший разряд. Получаем: 1100 (2) , что и соответствует действительности.

    Задание: Произвести проверку полученного результата.

    1100 (2) = 0×2 0 + 0×2 1 +1×2 2 +1×2 3 = 0 + 0 + 4 + 8 = 12 (10)

    110 (2) = 0×2 0 +1×2 1 +1×2 2 = 0 + 2 + 4 = 6 (10)

    Таким образом, получаем: 6 + 6 = 12, что соответствует действительности.

    Выполнить самостоятельно:

    Задание 1. Выполнить вычитание в двоичной форме:

    +
    1010 10 (10)

    110 6 (10)

    10000 соответствует: 16 (10)

    Выполнение действий происходит следующим образом.

    1) 0 плюс 0 равно О

    2) 1 плюс 1 равно 10 (что 2 (два) в двоичной системе представляется как 10);
    Исторически сложилось, что для сложения чисел использовалось десять пальцев и наоборот:

    9 + 1 = 10; 8 + 2 = 10; 1 + 9 = 10; 2 + 8 = 10.

    Поэтому и произошла десятичная система счисления. А в двоичной 2 (два) знака: 1 и 0

    3) 1 плюс 0 плюс 1 равно 10. Записываем 0 и переносим 1.

    4) 1 плюс 1 равно 10, поскольку это последнее действие, записываем 10, точно также сделали это в десятичной системе.

    Задание: Произвести проверку полученного результата:

    110