Найти в Дзене
Something Else

Калькулятор программиста?

Добрый день, уважаемые читатели. Я совсем недавно создал аккаунт, и это моя первая статья. Тема первой статьи предполагалась немного иная, но в связи с введением (карантина, самоизоляции) в стране, её написание не является возможным. А вот желание написать какую-либо статью, почему-то зашкаливает. Данная статья для автора носит отдельное название: "Проба пера" :-) Ну и ближе к делу. Многие пользователи Windows систем далекие от программирования задавались вопросом, что это за режим "Программист" стандартного калькулятора, зачем он нужен и что в нём считают? Ну не для кого не секрет, что все данные в компьютере хранятся в виде нулей и единиц, но ответа что в нём считают все-таки в голову не приходит. В данной статье я приведу пример наиболее популярного использования данного калькулятора на свой взгляд, но для начала расскажу небольшое вступление Низкоуровневые языки программирования Низкоуровневые языки программирования представляют собой язык, который наиболее близок к машинному код
Оглавление

Добрый день, уважаемые читатели.

Я совсем недавно создал аккаунт, и это моя первая статья. Тема первой статьи предполагалась немного иная, но в связи с введением (карантина, самоизоляции) в стране, её написание не является возможным. А вот желание написать какую-либо статью, почему-то зашкаливает. Данная статья для автора носит отдельное название: "Проба пера" :-) Ну и ближе к делу.

Многие пользователи Windows систем далекие от программирования задавались вопросом, что это за режим "Программист" стандартного калькулятора, зачем он нужен и что в нём считают?

Общий вид, стандартного калькулятора в  режиме "Программист"
Общий вид, стандартного калькулятора в режиме "Программист"

Ну не для кого не секрет, что все данные в компьютере хранятся в виде нулей и единиц, но ответа что в нём считают все-таки в голову не приходит.

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

Низкоуровневые языки программирования

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

Листинг программы на языке ассемблера Motorola MC6800
Листинг программы на языке ассемблера Motorola MC6800

Высокоуровневые языки программирования

Написание разветвляющих алгоритмов на низкоуровневых языках является очень сложным занятием. Для решение этой проблемы созданы высокоуровневые языки которые разработаны для удобства и простоты программирования. Основным отличием высокоуровневых языков является введение смысловой конструкций кратко описывающие действия. Большинство программистов работают именно с высокоуровневыми языками. Все вы могли встречаться с ними. Например, в школе или в университете на уроках информатики вы могли изучать "Basic","Паскаль" или "Delphi". Для тех, кто создавал свои web странички могли встретиться с такими языками как "JavaScript", "PHP". Но даже те, кто встречался уже с вышеперечисленными языками, всё же маловероятно нуждались в использовании рассматриваемого нами режима калькулятора.

Пример кода на высокоуровневом языке С++
Пример кода на высокоуровневом языке С++

Побитовые операции

Я рассмотрю использования данного калькулятора на примере побитовых операций в высокоуровневых языках. Для начала объяснения уточню что наименьшей единицей памяти является бит. Он представляет собой либо 0 либо 1. 8 бит представляют собой 1 байт.

В программирование есть необходимость сохранить какие-либо данные, а затем их использовать в нужном месте. Для простоты возьмём целое число. Допустим мы хотим сохранить число 7.

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

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

Как мы видим выше, чтобы сохранить число 7 нам необходимо как минимум 3 бита информации. 8 бит информации вмещают числа от 0 до 255. 16 бит (2 байта) информации вместят в себя уже числа от 0 до 65 535. В связи с этим в высокоуровневых языках программирования существуют различные типы данных. Например, если программист собирается сохранить число меньше 256 ему хватит всего лишь 1 байта информации, а если более 255, то требуется выбрать тип данных уже с 2 байтами информации. Как вы уже поняли объём памяти выделяется не по битам, а по байтам. В соответствии с выбором типа данных процессор выделит память с требуемым объемом памяти.

Проблема заключается в том, что популярным типом хранения данных является логический, или булевый. Для его хранения достаточно 1 бита информации, но при создании значений данного типа в высоких языках программирования, выделяется целый байт информации. 1 бит с полезной информацией, а 7 бит информации тратиться в пустую. Да многие из вас могут сказать, что потерять 1 байт информации в наше время — это ерунда... И тут вы от части правы, ранее вопрос об экономии памяти стоял куда более остро, но операционная система выделяет стек памяти в 1-2 мегабайта для программы, где хранятся фундаментальные переменные и фиксированные массивы (не хочу углубляться больше, чем планировал, поэтому опустим понимание стековой памяти). Но скажу, что игры, работающие на "OpenGL" и на данный момент используют именно экономный режим данных булевого типа.

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

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

1 символ (1-Персонаж игры не голоден, 0 - голоден)

2 символ (1-Персонаж игры спит, 0 - не спит)

3 символ (1-Имеется оружие, 0 - отсутствует оружие)

4 символ (1-Имеется ранение, 0 - отсутствует ранение)

5 символ (1-Персонаж в кепке, 0 - Без кепки)

6 символ (1-Персонаж в бронежилете, 0 - без бронежилета)

7 символ (1-Персонаж в кроссовках, 0 - без кроссовок)

8 символ (1-Персонаж в сапогах, 0 - без сапог)

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

1)-клавиатура с переключением битов 2) различные системы счисления
1)-клавиатура с переключением битов 2) различные системы счисления

Слева мы можем переключать различные системы счисления:

Hex: Шестнадцатеричная система счисления

Dec: Нами привычная десятичная система счисления

Oct: восьмеричная система счисления

Bin: Двоичная система счисления

Теперь мы можем записать в нашу ячейку памяти (условно назовём её СОСТОЯНИЕ) наше значение:

СОСТОЯНИЕ = 128; (или в hex: СОСТОЯНИЕ = 0x80;)

Как мы понимаем состояние персонажа будет изменяться в процессе игры, для этого нам необходимо изменять различные биты, независимо от других, для этого нам приходят на помощь побитовые операции. Их 6, но мы рассмотрим 4:

Побитовое не (~a) - Биты в "а" меняются на противоположные

Побитовое И (a $ b) - Значение 1 если в "a" и "b" 1

Побитовое ИЛИ (a | b) - Значение 1 если в "a" или "b" 1

Побитовое исключающее ИЛИ (a ^ b) - Если 1 только в "a", или только в "b"

Для того что бы включить нужный нам бит, необходимо воспользоваться побитовым или. В калькуляторе он обозначается как "OR" и вводим те биты которые необходимо включить. Например: 0000 1100 (кепку и бронежилет:

Выбираем операцию побитового или
Выбираем операцию побитового или

Затем выбираем знак равно. И получаем:

Результат побитового ИЛИ.
Результат побитового ИЛИ.

В двоичной системе значение 1 бита которое было изначально не изменилось. А 5 и 6 бит изменился на единицу. В принципе это то что надо. Поэтому в программном алгоритме мы можем написать следующее и быть уверены, что не зависимо от состояния битов, 5 и 6 бит будет включен:

СОСТОЯНИЕ = СОСТОЯНИЕ | 0xC; (в hex)

или СОСТОЯНИЕ = СОСТОЯНИЕ | 12; (в десятичной системе счисления)

Вот наглядный пример вычисления:

-8

Теперь представим, что кепка у персонажа слетела, и нам необходимо изменить 5 бит на 0. Для этого возьмём шаблон 0000 1000 (что соответствует 8, в десятичной системе счисления) и аналогично к нашему состоянию применим "побитовое и" (AND в калькуляторе) и в скобках к 8 применим "побитовое не" (NOT в калькуляторе):

Результат вычисления
Результат вычисления

Соответственно эти операции с этим шаблоном можно прописать в программном коде для изменения 5 бита на 0. наглядная демонстрация:

-10

Теперь представим, что нам необходимо изменить состояние 5 и 6 бита на противоположное ему значение.

Для этого к нашему состоянию применим побитовое исключающее или (в калькуляторе "XOR") с маской которую мы применяли ранее: 0000 1100 (или 12 в десятичной системе счисления):

Результат вычисления
Результат вычисления

Как мы видим биты 5 и 6 изменились на противоположные.

В программах маски для каждого бита прописываются отдельно. И пишут выражения с различным комплексом побитовых операций с данными не только 8 бит, а 16, 32, 64 и даже 128 бит. Естественно компьютер вычисляет эти операции самостоятельно, и программисту необходимо только задать операции которые необходимо выполнять программе. Но данный калькулятор может использоваться при составлении комплекса операций, перевода в различных системах счисления для удобства записи в код, а также при откладки и тестирования программы.

-12

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

Спасибо большое за уделённое внимания.

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

P.S. Данная статья для автора носит отдельное название: "Проба пера" :-)