Для решения своих задач человеку часто приходится преобразовывать имеющуюся информацию из одной формы представления в другую. Например, при чтении вслух происходит преобразование информации из дискретной (текстовой) формы в непрерывную (звук). Во время диктанта на уроке русского языка, наоборот, происходит преобразование информации из непрерывной формы (голос учителя) в дискретную (записи учеников).
Информация, представленная в дискретной форме, значительно проще для передачи, хранения или автоматической обработки. Поэтому в компьютерной технике большое внимание уделяется методам преобразования информации из непрерывной формы в дискретную.
Дискретизация информации — процесс преобразования информации из непрерывной формы представления в дискретную.
Рассмотрим суть процесса дискретизации информации на примере.
На метеорологических станциях имеются самопишущие приборы для непрерывной записи атмосферного давления. Результатом их работы являются барограммы — кривые, показывающие, как изменялось давление в течение длительных промежутков времени. Одна из таких кривых, вычерченная прибором в течение семи часов проведения наблюдений, показана на рис. 1.9.
Как писать двоичный код №1

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

Полученная таблица даёт не совсем полную картину того, как изменялось давление за время наблюдений: например, не указано самое большое значение давления, имевшее место в течение четвёртого часа наблюдений. Но если занести в таблицу значения давления, наблюдаемые каждые полчаса или 15 минут, то новая таблица будет давать более полное представление о том, как изменялось давление.
Таким образом, информацию, представленную в непрерывной форме (барограмму, кривую), мы с некоторой потерей точности преобразовали в дискретную форму (таблицу).
В дальнейшем вы познакомитесь со способами дискретного представления звуковой и графической информации.
1.5.2. Двоичное кодирование
В общем случае, чтобы представить информацию в дискретной форме, её следует выразить с помощью символов какого-нибудь естественного или формального языка. Таких языков тысячи. Каждый язык имеет свой алфавит.
Алфавит — конечный набор отличных друг от друга символов (знаков), используемых для представления информации. Мощность алфавита — это количество входящих в него символов (знаков).
Алфавит, содержащий два символа, называется двоичным алфавитом (рис. 1.11). Представление информации с помощью двоичного алфавита называют двоичным кодированием. Закодировав таким способом информацию, мы получим её двоичный код.
Кодирование текстовой информации

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

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

Двоичные символы (0,1) здесь берутся в заданном алфавитном порядке и размещаются слева направо. Двоичные коды (цепочки символов) читаются сверху вниз. Все цепочки (кодовые комбинации) из двух двоичных символов позволяют представить четыре различных символа произвольного алфавита:

Цепочки из трёх двоичных символов получаются дополнением двухразрядных двоичных кодов справа символом 0 или 1. В итоге кодовых комбинаций из трёх двоичных символов получается 8 — вдвое больше, чем из двух двоичных символов:

Соответственно, четырёхразрядный двоичный код позволяет получить 16 кодовых комбинаций, пятиразрядный — 32, шестиразрядный — 64 и т. д.
Длину двоичной цепочки — количество символов в двоичном коде — называют разрядностью двоичного кода.

Обратите внимание, что:
32 = 2•2•2•2•2 и т. д.
Здесь количество кодовых комбинаций представляет собой произведение некоторого количества одинаковых множителей, равного разрядности двоичного кода.
Если количество кодовых комбинаций обозначить буквой N, а разрядность двоичного кода — буквой i, то выявленная закономерность в общем виде будет записана так:
В математике такие произведения записывают в виде:
N = 2 i .
Запись 2 i читают так: «2 в i-й степени».
Задача. Вождь племени Мульти поручил своему министру разработать двоичный код и перевести в него всю важную информацию. Двоичный код какой разрядности потребуется, если алфавит, используемый племенем Мульти, содержит 16 символов? Выпишите все кодовые комбинации.
Решение. Так как алфавит племени Мульти состоит из 16 символов, то и кодовых комбинаций им нужно 16. В этом случае длина (разрядность) двоичного кода определяется из соотношения: 16 = 2 i . Отсюда i = 4.
Чтобы выписать все кодовые комбинации из четырёх 0 и 1, воспользуемся схемой на рис. 1.13: 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111.
На сайте http://sc.edu.ru/ размещена виртуальная лаборатория «Цифровые весы» (135009). С её помощью вы можете самостоятельно открыть метод разностей — ещё один способ получения двоичного кода целых десятичных чисел.
1.5.3. Универсальность двоичного кодирования
В начале этого параграфа вы узнали, что информация, представленная в непрерывной форме, может быть выражена с помощью символов некоторого естественного или формального языка. В свою очередь, символы произвольного алфавита могут быть преобразованы в двоичный код. Таким образом, с помощью двоичного кода может быть представлена любая информация на естественных и формальных языках, а также изображения и звуки (рис. 1.14). Это и означает универсальность двоичного кодирования.

Двоичные коды широко используются в компьютерной технике, требуя только двух состояний электронной схемы — «включено» (это соответствует цифре 1) и «выключено» (это соответствует цифре 0).
Простота технической реализации — главное достоинство двоичного кодирования. Недостаток двоичного кодирования — большая длина получаемого кода.
1.5.4. Равномерные и неравномерные коды
Различают равномерные и неравномерные коды. Равномерные коды в кодовых комбинациях содержат одинаковое число символов, неравномерные — разное.
Выше мы рассмотрели равномерные двоичные коды.
Примером неравномерного кода может служить азбука Морзе, в которой для каждой буквы и цифры определена последовательность коротких и длинных сигналов. Так, букве Е соответствует короткий сигнал («точка»), а букве Ш — четыре длинных сигнала (четыре «тире»). Неравномерное кодирование позволяет повысить скорость передачи сообщений за счёт того, что наиболее часто встречающиеся в передаваемой информации символы имеют самые короткие кодовые комбинации.
Самое главное.
Дискретизация информации — процесс преобразования информации из непрерывной формы представления в дискретную. Чтобы представить информацию в дискретной форме, её следует выразить с помощью символов какого-нибудь естественного или формального языка.
Алфавит языка — конечный набор отличных друг от друга символов, используемых для представления информации. Мощность алфавита — это количество входящих в него символов.
Алфавит, содержащий два символа, называется двоичным алфавитом. Представление информации с помощью двоичного алфавита называют двоичным кодированием. Двоичное кодирование универсально, так как с его помощью может быть представлена любая информация.
Вопросы и задания.
1.Ознакомьтесь с материалом презентации к параграфу, содержащейся в электронном приложении к учебнику. Что вы можете сказать о формах представления информации в презентации и в учебнике? Какими слайдами вы могли бы дополнить презентацию?
Источник: murnik.ru
Машинные коды двоичного числа
Машинные коды двоичного числа В ЭВМ в целях упрощения выполнения арифметических операций применяют специальные коды для представления чисел. При помощи этих кодов упрощается определение знака результата операции.
Операция вычитания (или алгебраического сложения) чисел сводится к арифметическому сложению кодов, облегчается выработка признаков переполнения разрядной сетки. В результате упрощаются устройства ЭВМ, выполняющие арифметические операции. Для представления чисел со знаком в ЭВМ применяют прямой, обратный и дополнительный коды. Общая идея построения кодов такова.
Код трактуется как число без знака, а диапазон представляемых кодами чисел без знака разбивается на два поддиапазона. Один из них представляет положительные числа, другой – отрицательные. Разбиение выполняется таким образом, чтобы принадлежность к поддиапазону определялась максимально просто.
Наиболее распространенным и удобным является формирование кодов таким образом, чтобы значение старшего разряда указывало на знак представляемых чисел, т.е. использование такого кодирования позволяет говорить о старшем разряде как о знаковом (бит знака) и об остальных как о цифровых разрядах кода. Прямой код Прямой код двоичного числа образуется из абсолютного значения этого числа и кода знака (нуль для положительных чисел или единица для отрицательных чисел) перед его старшим числовым разрядом. Цифровые разряды прямого кода содержат модуль представляемого числа, что обеспечивает наглядность представления чисел в прямом коде (ПК). Пример. Записать прямой код чисел
и 
Рекомендуемые материалы
ЛР №3 — Вывести на экран найденные числа и их количество
Объектно-ориентированное программирование (ООП)
299 149 руб.
из массива убрать числа кратные 3
Информатика
Программа перевода десятичного числа в двоичную и шестнадцатеричную системы счисления
Информатика
1 и последняя цифра числа, задача с большим и маленьким квадратом, квадратное ур-ие
Информатика
Представление данных в памяти персонального компьютера (числа, символы, графика, звук)
Информатика
Гибридные интеллектуальные человеко-машинные вычислительные системы и когнитивные процессы
Информатика
Решение: Рассмотрим однобайтовое представление двоичного числа.
В прямом коде нуль имеет двоякое изображение:
– положительный ноль,
– отрицательный ноль.
В общем случае ОК является дополнением модуля исходного числа до наибольшего числа без знака, помещенного в разрядную сетку. Обратный код В обратном коде (ОК), также как и в прямом коде, для обозначения знака положительного числа используется бит, равный нулю, и знака отрицательного – единице. Обратный код положительного двоичного числа совпадает с его прямым кодом.
Обратный код отрицательного двоичного числа содержит единицу в знаковом разряде, формируется дополнением модуля исходного числа нулями до самого старшего разряда модуля, а затем поразрядной заменой всех нулей числа на единицу и всех единиц на нули. Обратный перевод осуществляется в той же последовательности. Пример.
Записать обратный код чисел
и
Решение:
Работа с обратным кодом вызывает ряд трудностей. В частности, возникают два нуля: положительный и отрицательный, т.е. в прямом коде (в котором представлены положительные числа) имеет место
, а в обратном коде (в котором представлены отрицательные числа)
.
Дополнительный код Дополнительный код (ДК) строится следующим образом. Дополнительный код положительного двоичного числа совпадает с его прямым кодом. Для отрицательных двоичных чисел сначала формируется обратный код (ОК), а затем к младшему разряду (МЗР) прибавляют 1. Обратный перевод ДК в ПК осуществляется аналогичными операциями в той же последовательности. Пример.
Записать дополнительный код чисел
и
Решение:
Использование ДК для представления отрицательных чисел устраняет двусмысленное представление нулевого результата (возникновение двух нулей: положительного и отрицательного), так как отрицательный ноль исчезает. В общем случае использованием ДК для записи отрицательных чисел можно перекрыть диапазон десятичных чисел от –2 k -1 до +2 k -1 -1, где k – число используемых двоичных разрядов, включая знаковый.
Так, с помощью одного байта можно представить десятичные числа от
до
, либо только положительные числа от 0 до 255 (здесь под положительными числами понимаются числа без знака). Оба этих способа представления чисел (со знаком и без знака) широко используются в ЭВМ.
В ЭВМ используется быстрый способ формирования ДК. Его суть заключается в следующем. Двоичное число в ПК просматривается от младшего значащего разряда к старшему. Пока встречаются нули, их копируют в одноименные разряды результата.
Первая встретившаяся единица также копируется в соответствующий разряд, а каждый последующий бит исходного числа заменяется на противоположный (0 – на 1, 1 – на 0). Пример. Записать дополнительный код числа
двумя способами. Решение: 1 способ (быстрый).
2 способ.
Как видно, результаты, полученные при преобразовании обоими методами, совпадают.
Модифицированные обратные и дополнительные коды Модифицированные обратные и дополнительные коды двоичных чисел отличаются соответственно от обратных и дополнительных кодов удвоением значений знаковых разрядов. Знак «+» в этих кодах обозначается двумя нулевыми разрядами, а «–» – двумя единичными разрядами.
Целью введения модифицированных кодов являются фиксация и обнаружение случаев переполнения разрядной сетки. В этом случае перенос из значащего разряда может исказить значение младшего знакового разряда. Значение знаковых разрядов «01» свидетельствует о положительном переполнении разрядной сетки, а «10» — об отрицательном переполнении. Лекция «6.
Информационный рынок» также может быть Вам полезна. Вопросы для самопроверки: 1. Дайте определение системы счисления. Какие системы счисления Вы знаете? 2. Сформулируйте правило перевода целых чисел из одной системы счисления в другую. 3. Сформулируйте правило перевода дробных чисел из одной системы счисления в другую.
4. В чем особенность перевода чисел из восьмеричной (шестнадцатеричной) системы счисления в двоичную и наоборот? 5. Сформулируйте правило формирования прямого, обратного и дополнительного кодов двоичного числа.
Поделитесь ссылкой:
Рекомендуемые лекции
- Таблицы по кристаллографии
- Лекция 1
- Часть 2
- 6. Информационный рынок
- 13. Требования к изготовлению бланков
Источник: studizba.com
Фундаментальные основы хакерства. Определяем циклы в двоичном коде программы

В сегодняшней статье мы изучим все типы циклов, которые могут встретиться в языках программирования высокого уровня. Увидим, какие способы есть у компилятора для отражения их в двоичном виде. Разберем плюсы и минусы каждого. Кроме того, мы узнаем, как перемалывают циклы различные трансляторы и что получается на выходе у оптимизирующих и неоптимизирующих компиляторов.
Фундаментальные основы хакерства
Пятнадцать лет назад эпический труд Криса Касперски «Фундаментальные основы хакерства» был настольной книгой каждого начинающего исследователя в области компьютерной безопасности. Однако время идет, и знания, опубликованные Крисом, теряют актуальность. Редакторы «Хакера» попытались обновить этот объемный труд и перенести его из времен Windows 2000 и Visual Studio 6.0 во времена Windows 10 и Visual Studio 2019.
Ссылки на другие статьи из этого цикла ищи на странице автора.
Циклы — единственная (за исключением неприличного GOTO ) конструкция языков высокого уровня, имеющая ссылку «назад», то есть в область младших адресов. Все остальные виды ветвлений — будь то IF — THEN — ELSE или оператор множественного выбора SWITCH — всегда направлены «вниз», в область старших адресов. Вследствие этого изображающее цикл логическое дерево настолько характерно, что легко опознается с первого взгляда.
Существуют три основных типа цикла:
- Циклы с условием в начале.

- Циклы с условием в конце.

- Циклы с условием в середине.

Комбинированные циклы имеют несколько условий в разных местах, например в начале и конце одновременно. В свою очередь, условия бывают двух типов: условия завершения цикла и условия продолжения цикла.
В первом случае, если условие завершения истинно, выполняется переход в конец цикла, иначе он продолжается. Во втором, если условие продолжения цикла ложно, выполняется переход в конец цикла, в противном случае он продолжается. Легко показать, что условия продолжения цикла представляют собой инвертированные условия завершения.
Таким образом, со стороны транслятора вполне достаточно поддержки условий одного типа. И действительно, операторы циклов while , do и for языка С/C++ работают исключительно с условиями продолжения цикла. Оператор while языка Delphi также работает с условием продолжения, и исключение составляет один лишь repeat-until , ожидающий условие завершения цикла.
Циклы с условиями в начале
Их также называют циклами с предусловием. В языках С/C++ и Delphi поддержка циклов с предусловием обеспечивается оператором while ( условие) , где условие — это условие продолжения цикла. То есть цикл while ( a < 10) a++; выполняется до тех пор, пока условие ( a>10) остается истинным. Однако транслятор при желании может инвертировать условие продолжения цикла на условие его завершения. На платформе Intel 80×86 такой трюк экономит от одной до двух машинных команд.
Обрати внимание: ниже приведен цикл с условием завершения цикла.

А далее — с условием продолжения цикла.

Как видно на картинках, цикл с условием завершения на одну команду короче! Поэтому практически все компиляторы (даже неоптимизирующие) всегда генерируют первый вариант. А некоторые особо одаренные даже умеют превращать циклы с предусловием в еще более эффективные циклы с постусловием (см. пункт «Циклы с условием в конце»).
Цикл с условием завершения не может быть непосредственно отображен на оператор while . Кстати, об этом часто забывают начинающие, допуская ошибку «что вижу, то пишу»: while ( a > = 10) a++ . С таким условием цикл вообще не выполнится ни разу! Но как выполнить инверсию условия и при этом гарантированно не ошибиться?
Казалось бы, что может быть проще, а вот попросите знакомого хакера назвать операцию, обратную «больше». Очень может быть (даже наверняка!), что ответом будет. «меньше». А вот и нет, правильный ответ «меньше или равно». Полный перечень обратных операций отношений можно найти в следующей таблице.

Циклы с условием в конце
Их также называют циклами с постусловием. В языке С/C++ поддержка циклов с постусловием обеспечивается парой операторов do … while , а в языке Delphi — repeat … until . Циклы с постусловием без каких‑либо проблем непосредственно отображаются с языка высокого уровня на машинный код и наоборот. То есть, в отличие от циклов с предусловием, инверсии условия не происходит.

Сравним код цикла с постусловием и код цикла с предусловием. Не правда ли, цикл с условием в конце компактнее и быстрее? Некоторые компиляторы (например, Microsoft Visual C++) умеют транслировать циклы с предусловием в циклы с постусловием. На первый взгляд, это вопиющая самодеятельность компилятора — если программист хочет проверять условие в начале, то какое право имеет транслятор ставить его в конце?
Спрашивается: и на кой все эти извращения, значительно раздувающие код? Дело в том, что блок статического предсказания направления ветвлений процессоров Pentium и всех последующих моделей оптимизирован именно под переходы, направленные назад, то есть в область младших адресов. Поэтому циклы с постусловием должны выполняться несколько быстрее аналогичных им циклов с предусловием.
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Крис Касперски
Известный российский хакер. Легенда ][, ex-редактор ВЗЛОМа. Также известен под псевдонимами мыщъх, nezumi (яп. 鼠, мышь), n2k, elraton, souriz, tikus, muss, farah, jardon, KPNC.

Юрий Язев
Широко известен под псевдонимом yurembo. Программист, разработчик видеоигр, независимый исследователь. Старый автор журнала «Хакер».
Источник: xakep.ru