четверг, 20 февраля 2014 г.

Код

Какое число представлено на следующей картинке?

Верно ли следующее выражение?

101 - 11 = 10

А что такое "почахо"?

Отвечу по порядку.

Десять разогнутых пальцев представляют число 10 или 1023, в зависимости от того, ведется счет в десятичной или двоичной системе (см. Считаем до 1000... на пальцах).

Выражение 101 - 11 = 10 верно, если числа в нем записаны в двоичной системе счисления, и неверно, если это десятичная запись чисел.

"Почахо" - это слово "РОСНАНО", написанное кириллицей и ошибочно прочитанное, как будто оно написано латинскими буквами.

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

Код - это способ представления информации.

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

Код, или система кодирования, определяет не только набор символов (знаков), но и правила использования этих символов для представления информации. Непосредственно с помощью цифр от 0 до 9 кодируются только десять чисел, от нуля до девяти. А для кодирования других чисел необходимы правила записи многозначных чисел (а также дробных и отрицательных). Для чтения слов "night" или "busy" также недостаточно знать латинские буквы, а нужно знать правила чтения на английском языке и, возможно, исключения из этих правил. Иными словами, необходимо знать правила составления кодовых слов из кодовых символов.

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

Кодовые слова - строительные блоки кодированного сообщения.

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

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

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

Каждый из числовых кодов определяет набор кодовых символов и правила составления кодовых слов из этих символов. Десятичный код использует цифры от 0 до 9 для записи чисел в виде одного и более десятичных разрядов (то есть, разрядов, способных вместить десять разных значений). А двоичный код использует цифры 0 и 1 для записи чисел в виде одного и более двоичных разрядов.

Числовое кодирование, когда одни и те же цифры в разных разрядах имеют разные значения, называется позиционным кодированием. Так, в десятичной записи числа 55 цифра 5 в младшем разряде, или позиции, обозначает пять единиц, а цифра 5 во втором разряде - пять десятков.

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

Пример непозиционного числового кодирования - римская запись чисел, использующая римские цифры. Хотите развлечься? Тогда скажите, какое это число: MMXIV? А это: DCCCLXXXVIII? Если справились, тогда попробуйте вычесть из него XLVII (можно в столбик)!

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

Начнем с простейшего случая (он же самый фундаментальный). Один двоичный разряд содержит 0 или 1. Этими значениями можно закодировать любые две отличные друг от друга величины или состояния: "вкл." и "выкл.", "светло" и "темно", "достаточно" и "недостаточно", "занято" и "свободно", "истина" и "ложь". Значения, которые мы приписываем кодовым словам 0 и 1, зависят от нашего желания.

Двоичный разряд называется бит (от английсикх слов binary digit).

Для кодирования более чем двух значений нам понадобится более одного бита. Два бита позволяют закодировать 4 различных значения (22 = 4). Например:

000север
101восток
210юг
311запад

или

000я
101ты
210он
311она

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

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

0000красный
1001оранжевый
2010желтый
3011зеленый
4100голубой
5101синий
6110фиолетовый

Нам потребовались три бита для двоичного кодирования семи цветов радуги. При этом еще одно трехразрядное двоичное кодовое слово, 111, осталось неиспользованным. Задействуем и его, приняв, что 0 обозначает отсутствие информации о цвете:

0000нет информации
1001красный
2010оранжевый
3011желтый
4100зеленый
5101голубой
6110синий
7111фиолетовый

Все просто, не так ли? В таком случае, какие три цвета закодированы в следующем сообщении?

001011100

Ответьте на этот вопрос, прежде чем читать дальше.

А если прочитать трехразрядные кодовые слова справа налево? Последовательность цветов будет иной: 100 - зеленый, 011 - желтый, 001 - красный. Это еще одно напоминание о том, что, кроме таблицы кодов, нужно определить и придерживаться правил кодирования-декодирования. Одно из них определяет направление записи кодированного сообщения, справа налево или слева направо.

В рассмотренных примерах числовые коды кодируют значения или "смыслы" из некоторой предметной области: стороны света, цвета радуги. Но существует и другой подход к кодированию, когда кодовые слова соответствуют не смыслам, а символам (знакам) из некоторого набора символов.

Набор символов принято называть алфавитом. В случае кодирования символов, система кодирования сопоставляет кодовые слова символам исходного алфавита. Заметим, что сами кодовые слова также состоят из символов некоторого алфавита, назовем его кодовым.

Примером кодирования символов, а не смыслов, может быть кодирование букв русского алфавита. В соответствие буквам поставим двухразрядные десятичные числа от 01 до 33, а в соответствие пробелу - число 34.

01а18р
02б19с
03в20т
04г21у
05д22ф
06е23х
07ё24ц
08ж25ч
09з26ш
10и27щ
11й28ь
12к29ы
13л30ъ
14м31э
15н32ю
16о33я
17п34<пробел>

Здесь тридцать три строчные русские буквы и пробел - символы исходного алфавита. А соответствующие им кодовые слова от 01 до 34 составлены из символов кодового алфавита - цифр от 0 до 9.

Теперь фразу "привет мир" можем записать так (проверьте!):

17181003062034141018

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

Для представления 33 прописных букв, 10 цифр, 9 знаков препинания .,;:!?-"" и скобок () нам понадобится еще 54 кодовых слова. Для кодирования текста нам также нужны коды, обозначающие конец строки и отступ, например, для красной строки. И неплохо было бы иметь коды для знаков арифметических операций, фигурных {} и квадратных скобок [], а также таких символов, как , %, $ и некоторых других.

Примерно так и рассуждали создатели первых кодировок для хранения в компьютере текстовой информации. В результате их усилий родился стандарт ASCII (American Standard Code for Information Interchange) - американский стандартный код для обмена информацией. ASCII использует 128 чисел, от 0 до 127, для кодирования букв латинского алфавита, цифр, знаков препинания и ряда специальных символов:

0 NULL 32 Space 64 @ 96 `
1 SOH 33 ! 65 A 97 a
2 STX 34 66 B 98 b
3 ETX 35 # 67 C 99 c
4 EOT 36 $ 68 D 100 d
5 ENQ 37 % 69 E 101 e
6 ACK 38 & 70 F 102 f
7 BEL 39 71 G 103 g
8 BS 40 ( 72 H 104 h
9 TAB 41 ) 73 I 105 i
10 LF 42 * 74 J 106 j
11 VT 43 + 75 K 107 k
12 FF 44 , 76 L 108 l
13 CR 45 - 77 M 109 m
14 SO 46 . 78 N 110 n
15 SI 47 / 79 O 111 o
16 DLE 48 0 80 P 112 p
17 DC1 49 1 81 Q 113 q
18 DC2 50 2 82 R 114 r
19 DC3 51 3 83 S 115 s
20 DC4 52 4 84 T 116 t
21 NAK 53 5 85 U 117 u
22 SYN 54 6 86 V 118 v
23 ETB 55 7 87 W 119 w
24 CAN 56 8 88 X 120 x
25 EM 57 9 89 Y 121 y
26 SUB 58 : 90 Z 122 z
27 ESC 59 ; 91 [ 123 {
28 FS 60 < 92 124 |
29 GS 61 = 93 ] 125 }
30 RS 62 > 94 ^ 126 ~
31 US 63 ? 95 _ 127 DEL

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

Кодирование текста при помощи ASCII предполагает, что каждое кодовое слово имеет фиксированную длину. Например, если мы запишем "Hello World" с помошью десятичных кодов ASCII, мы должны сделать этот так:

072101108108111032087111114108100
Каждое кодовое слово здесь имеет три разряда. Значит, мы всегда можем сказать, где кончается одно кодовое слово и начинается другое, что и позволяет однозначно декодировать текст:
072 101 108 108 111 032 087 111 114 108 100
 H   e   l   l   o       W   o   r   l   d

Что касается кодирования букв русского алфавита для хранения в компьютере, то эта поразительная тема требует отдельной статьи!

А из этой статьи мы узнали

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

Кроме того, мы разработали несколько кодов для кодирования смыслов и символов. Не боги горшки обжигают!

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

  1. Сколько будет 5 + 3, если известно, что '+' означает операцию сложения, а числа записаны НЕ в десятичном коде?
  2. Что такое "АБЫРВАЛГ"?
  3. Если индиец в ответ на ваш вопрос покачал головой из стороны в сторону, что он имел в виду?

Комментариев нет:

Отправить комментарий