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

Чтобы понять, как, черт возьми, он что-то делал с помощью простой коммуникации, вы должны понимать, что ученые быстро согласились сообщить компьютерам, что некоторые двоичные числа всегда будут представлять какие-то буквы и символы, компьютерный «код» , если вы будете. Система для телеграфа уже существовала, и она была адаптирована в код, который они назвали Американским стандартным кодом обмена информацией (ASCII). В ASCII 7-битные двоичные числа от 32 до 127 представляют буквы, знаки препинания и символы. Цифры ниже 32 представляют управляющие коды, функции пишущей машинки, такие как «перевод строки» и «подача страницы». Эти базовые коды дают компьютеру слова, с помощью которых люди могут писать функции.

Примечание. Сейчас это, как правило, заменено на UTF-8 и 2-байтовую кодировку Unicode, которая позволяет представлять гораздо более широкий спектр символов и простых изображений, включая эмодзи, используя где-то от 2 до 6 байтов. Для получения дополнительной информации об этом прочтите эту замечательную статью Stack Overflow CEP Джоэла Спольски: https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively -должен-знать-о-Юникод-и-наборах-символов-без-оправданий /

Очень и очень простые программы

Компьютеры уже несколько десятилетий не нуждаются в перфокартах. Но в последнее время многие компьютеры по-прежнему поставлялись с шестнадцатеричным редактором или позволяли пользователю устанавливать его, с помощью которого пользователь мог взаимодействовать с компьютером в двоичном формате. Простая программа в двоичном формате будет 0001000 0000101 0000001 (еще раз спасибо, переполнение стека). После преобразования в машинный код это будет 8 5 1. Эта программа при запуске отобразит 5. Честно говоря, я даже не могу объяснить почему. В общем смысле первое число, скорее всего, является адресом в ЦП, затем второе - число 5, а последнее - вызов печати. Или нет. Это может быть вызов функции «печать», число 5 и целевой код для «консоли».

Вы можете видеть, как быстро это станет чрезвычайно подробным и подверженным ошибкам, поэтому никто не программирует таким образом только для демонстрации. Вот довольно невероятная демонстрация классической программы Hello World, написанной в двоичном формате: http://timelessname.com/elfbin/

Бинарные «побитовые» операции

Некоторые люди до сих пор пишут язык ассемблера, который является лишь небольшим шагом вперед по сравнению с двоичным, и о котором я расскажу в другой раз, но по большей части единственная часть двоичного языка, которую программист должен помнить, - это побитовые операторы. Они представляют собой группу операторов, которые буквально сравнивают наборы битов, по одному бит за раз, и, если требуется, изменяют их. Они важны, потому что они доступны для использования с двоичными или десятичными числами в C и различных языках на основе C, которые нам почти наверняка понадобятся для создания машинного разума. Ниже приведен упрощенный обзор этих операторов, работающих с 8-битными целыми числами. На самом деле они по умолчанию работают с 32-битными целыми числами со знаком (то есть положительными или отрицательными), и они также могут сравнивать большие наборы. (Вот более подробное объяснение https://en.wikipedia.org/wiki/Bitwise_operation)

Есть дополнительные побитовые операции, такие как круговые сдвиги, но это основы. Вы увидите, что эти отношения между битами не соответствуют никакому арифметическому оператору в десятичной системе счисления, поэтому вы можете задаться вопросом, какова его цель. Но помните, что * все * является двоичным для компьютера, поэтому эта странная математика может быть очень полезна для сравнения больших кусков нулей и единиц, которые могут представлять * что угодно *. Например, сетка 16 x 16, где 0 - черный, а 1 - белый, может образовывать изображение, а операторы & могут сравнивать два таких набора и показывать их сходство, как показано ниже.

&

Этот оператор называется И. Он сравнивает биты и возвращает 1 только тогда, когда оба сравниваемых бита равны 1, например:

|

Это оператор ИЛИ. Он сравнивает биты и возвращает 1, когда один или оба бита равны 1, например:

^

Это оператор XOR. Он сравнивает биты и возвращает 1, когда один из битов равен 1, но не оба.

~

Этот оператор НЕ. Он немного переключается на свою противоположность.

>>

Это сдвиг вправо. Он сдвигает все биты вправо на один и заполняет 0.

Сдвиг бита вправо всегда делит на 2, потому что бит вправо имеет половину значения в базе 2, точно так же, как деление на 10 в базе 10 просто перемещает десятичный разряд на единицу.

<<

Это сдвиг влево. Он сдвигает все оставшиеся биты на один и заполняет 0.

Сдвиг бита влево всегда умножается на 2, потому что бит вправо имеет удвоенное значение в базе 2, точно так же, как умножение на 10 в базе 10 просто перемещает десятичный разряд на единицу.

Большой прыжок назад

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