TURBO PASCAL

Новости           

Программы

Turbo Pascal

Игры

Документация

"Странности"

FAQ

Ссылки

Гостевая книга

Рассылка

Благодарности

От автора

 

 

 
СИСТЕМЫ СЧИСЛЕНИЯ ч2 Двоичная система
Вступление
Теория
А нафига они нужны - эти системы?
Послесловие

Вступление

По последним данным на рассылку подписалось около 600 человек. Думается, что больше уже не будет, так что продолжим. Судя по статистике 1 выпуск прочитали далеко не все. Если интересно узнать про шеснадцатеричную систему, то вам сюда. Сегодня мы продолжим и узнаем про двоичную систему.
А так же наконец узнаем зачем нам нужна вся эта фигня!!!

Теория

Итак системой счисления, а вернее её основанием, называется колчество знаков. Так для десятичной системы - 10 знаков (от 0 до 9), шестнадцатеричной - 16 (0..F), а следовательно у двоичной всего 2 знака - 0 или 1. Обозначаются двоичные числа так: 110101b. b - это сокращение от слова Binary (двоичный). Рассмотрим несколько двоичных чисел:

0000b 0
0001b 1
0010b 2
0011b 3
0100b 4
и т.д...

Теперь о переводе в десятичную систему: перевод осуществляестся по тому же принципу, что и в шестнадцатеричной, т.е:
101101b = 1 * 2 5 + 0 * 2 4 + 1 * 2 3 + 1 * 2 2 + 0 * 2 1 + 1 * 2 0 = 45 = 2Dh
Для тех, кто не очень внимательно читал предыдущий выпуск, повторюсь: берём самую правую цифру и умножаем на 2 в 0 степени, сдвигаемся на одну цифру влево и умножаем на 2 в 1, ......... и т.д. пока не дойдём до конца. Вся сложность этого метода состоит в том, что нужно помнить много степеней 2 (или той системы из которой переводим), на первый взгляд это тяжело, но по-переводив пару сотен чисел степени запомнятся сами собой. Как можно заметить, этот метод годится для перевода чисел из любых систем счисления в 10-ую, только нужно домножать на основание системы.

Теперь о переводе наоборот: из 10-ой в 2-ую. Тут тоже действует уже, надеюсь, известный вам способ деления, т.е. число делим на 2; число получившеесе в остатке является младшей двоичной цифрой. Затем уже частное поделить на 2 и полученый остаток даст следующую влево 2-ую цифру. Продолжая таким образом пока в частном не получится 0, из остатков получим все необходимые 2-ые цифры.

Частное Остаток Двоичная цифра
45 / 2 22 1 1 (младшая цифра)
22 / 2 11 0 0
11 / 2 5 1 1
5 / 2 2 1 1
2 / 2 1 0 0
1 / 2 0 1 1 (старшая цифра)
Тут также нет ничего сложного.

Теперь о переводе в шестнадцатеричную систему: тут алгоритм посложнее: начиная с правой цифры разбиваете число на соответствующие 16-ой системе. Ясно это будет из дальнейших примеров:
101101b разбиваем справа: 1b = 1h, 01b=1h, 101b=5h 1101b=Dh СТОП! Первая правая цифра уже есть! Рассмотрим оставшуюся часть: 10b = 2h, и следовательно наше число 101101b = 2Dh. Почему мы остановились после 1101b ? Просто потому, что 01101b=Dh, а 101101b > Fh, а нам нужно получить только одну цифру числа.
Ещё один пример, показан он по другому:
10101011b = (1010)(1011)b = ABh Т.е. нужно запомнить первые 16 чисел 2-ой системы и тогда сразу будет видно, когда нужно остановиться. Число 01011b так же равно Bh, но при этом нуль слева нам совсем не нужен, т.к. он не играет никаой роли, т.е. мы можем дополнить число любым количеством нулей слева и поэтому этот на этот нуль мы не смотрим, а следущее число 101011b > Fh = 1111b и значит мы производим разбивку по 4-ой цифре, т.е. (1010)b и (1011)b. Это и даёт нам конечный результат.

Двойчная арифметика. Сейчас мы заново научимся складывать числа столбиком :)
  1011101
+1111001
11010110
Правила всё те же, что и для десятичной системы, но нужно помнить, что 1b + 1b = 10b. Вычитание - это всё наоборот, 10b - 1b = 1b, а правила - знакомые со школы!

А теперь поговорим об отрицательных числах. Начнём с простого числа (-1). Как же можно представить его в двоичном виде ??
Ответ кроется в следуещем соображении: (-а) = 0 - а :))) Тут вроде бы всё ясно, НО какой глубокий смысл! Рассмотрим число (-1): (-1) = 0 - 1, а теперь в двоичном виде:

 000000000
-000000001
 111111111
Какаво ??? Удивительно, но это логично: попробуйте к 111111111111b прибавить 000001b и получится 0 !!!! Это очень интересное свойство двоичных чисел.

Ну а перевод отрицательных двоичных в 10-ую систему происходит так:

  1. переворачиваем все цифры на противоположные, т.е. вместо 0 ставим 1 и наоборот.
    11111011b -> 00000100b
  2. переводим полученное в Dec
    00000100b = 4
  3. добавляем 1
    4 + 1 = 5
  4. ставим знак минус
    5 -> -5
Ладно, а теперь всё проверим..... Запускаем виндовский калькулятор, ставим галочку Bin, вводим 11111011, ставим галочку Dec, и ...... видим на экране 251 ??? Что-то тут не так! В душу вкладывается сомнение: а не гон ли всё это? Устроим ещё одну проверку: берём (-5), ставим галочку Bin, и видим число : 1111111111111111111111111111011 ? Похоже, но не то! (Кстати попробуйте перевести его обратно в Dec :)). Вся фишка заключается в том, что виндовский калькулятор: не умеет преобразовывать отрицательные Bin в Dec.
Об числе 1111111111111111111111111111011b : всё дело втом, что когда мы вычитали из 000b 001b, то мы не учли одной очень нужной вещи: к числу можно добавить любое количество нулей слева!! Т.е. 0 у калькулятора выглядит так: 00000000000000000000000000000000b :)) Вот и весь прикол! В (-1) на самом деле бесконечное множество 1.

А теперь ещё одно маленькое соглашение: что бы не уподобляться виндовскому калькулятору и не путать отрицательные числа с положительными (в Bin разумеется), мы будем писать положительные числа, добавляя слева нуль (например: 1 = 01b, 2 = 010b и т.д.), а отрицательные без него (-1 = 1111b)! Тем самым мы предотвратим возможную путаницу!

А нафига они нужны - эти системы?

Да уж волнующая тема! Теперь появилась ещё одна система, а зачем оно ?
Ок. Начну отдалённо. Наименьшей единицей хранения информации является бит (ну это, как секунда в СИ). Соответственно бит может принемать два состояния, которые условно называют правда и ложь. Для обозначения этого можно использовать 1 (правда) и 0 (ложь). Чуствуете ? Пахнет двоичной системой счисления!
Из бит складываются байты. 1 байт = 8 битам. Т.е. что бы закодировать 1 байт нам нужно написать последовательность из 8 битов: 10110110
Сколько же может быть комбинаций еденичек и нулей? Оказывается всего 256. Этих 256 комбинаций хватает, что бы закодировать в них символы алфавита, поэтому с помощью 1 байта мы можем представить символ подчти каждого алфавита. Естественно, что мы таким образом кодируем номер символа, а выводом нужного знака на экран по этому номеру занимается видеокарта.
Хорошо, отношение двоичной системы к битам вроде бы понятно, но шеснадцатеричная-то тут при чём???
Да вообщем-то она и не при делах :) Просто её удобнее использовать. В самом деле hex-число, состоящее из 2-х знаков полнотью описывает все 256 возможных комбинаций. FFh = 255 (256 комбинацию составляет число 00h). Получается, что 1 шеснадцатеричная цифра может закодировать пол-байта (это так называемый огрызок, или нибл). Согласитесь чем для каждого байта писать восемь цифр удобнее написать две, а после окажется, что рабтотать с ними удобнее, чем с десятичными.

Послесловие

Ну вот теперь вы изучили мат. часть :) Это самое главное! Со следующего выпуска мы начнём писать программы на Паскале.
Если вы ещё им не обзавелись, то самое время это сделать. На сайте 
лежит ссылка, на работо способность они к сожалению не проверены. Лучшим же выходом является попрежнему покупка CD диска с Паскалем. Напомню, что нам нужен Borland Pascal 7 (или Turbo Pascal 7). На этом всё.

Если, что надо - мыльте ibp7@yandex.ru.
© 2002 Использование материалов без согласия авторов запрещено

 

На первую страницу

 

Rambler's Top100 PROext: Top 1000 Rambler's Top100
(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz