Если хочется низко-низкоуровневого программирования с битами и байтами
Все знают, что подавляющее большинство современных компьютеров работает в двоичном коде, т.е. оперирует всего двумя значениями — битами — «0» и «1». Потом из них складываются байты, слова, кило-, мега- и гигабайты etc. Но что происходит внутри процессора, как именно обрабатываются двоичные числа, например выполняются арифметические операции? Об этом — в публикации. Статья, я думаю, будет особенно интересна тем читателям, у которых во время обучения не было соответствующих курсов.
- Описание
- Подробнее
Описание
Сразу должен предупредить, что в отличие от предыдущих двух статей, здесь вы не встретите каких-то сведений, имеющих практическое значение для 1С-ника. Статья имеет скорее ностальгически-познавательный характер.
Итак, начнем. Не будем останавливаться на том, что такое двоичная система, и почему именно она заняла лидирующее положение в цифровой вычислительной технике (так было не всегда, и в связи это не так до сих пор). Ниже будет применяться следующая форма записи: 2310=101112.
Как известно, байт — это 8 бит. Количество различных чисел, которые можно задать с помощью 1 байта = 28 = 256: 010..25510 или 000000002..111111112. Первый бит, тот который крайний слева, называется старшим, последний, соответственно, младшим. Умножение числа на 2 (основание системы счисления), это просто дописывание в конце числа "0", или, что то же, сдвиг числа на один разряд в сторону старшего бита: 210 -> 410: 000000102 -> 000001002. Аналогично, деление на 2 — сдвиг в обратную сторону.
Помните в 1 классе таблицу сложения? Так вот, в двоичной системе счисления она весьма невелика:
| Бит А | Бит Б | Сумма |
| 0 | 0 | 00 |
| 0 | 1 | 01 |
| 1 | 0 | 01 |
| 1 | 1 | 10 |
В последней строке у нас получилось число 102, старший бит которого равен единице. При поразрядном сложении ("столбиком") больших чисел в двоичной системе этот бит переноса — то самое значение, которое "в уме" ("ноль пишем, один в уме"). Он будет участвовать в сложении следующих разрядов:
Бит переноса предыдущего сложения | Бит А | Бит Б | Сумма |
| 0 | 0 | 0 | 00 |
| 0 | 0 | 1 | 01 |
| 0 | 1 | 0 | 01 |
| 0 | 1 | 1 | 10 |
| 1 | 0 | 0 | 01 |
| 1 | 0 | 1 | 10 |
| 1 | 1 | 0 | 10 |
| 1 | 1 | 1 | 11 |
Вот сложение 2310 + 2910 = 5210
00010111
+ 00011101
= 00110100
Реалии цифровой электроники таковы, что на полупроводниковой элементной базе легко воспроизвести булевы функции — И, ИЛИ, НЕ. Также легко реализуются поразрядные сдвиги влево и вправо.
Вот схематичные примеры электронных схем на транзисторах (источник — яндекс-картинки):

Представив "1" и "0" как "Истина" и "Ложь" легко эмулировать сложение двух бит логическими функциями.
Для первой таблицы (без учета бита переноса предыдущего сложения):
БитПереноса = БитА И БитБ;
БитСумма = (БитА И Не БитБ) Или (Не БитА И БитБ);
С учетом предыдущего бита переноса:
НовыйБитПереноса = БитА И БитБ Или (БитА Или БитБ) И БитПереноса;
БитСумма = (БитА Или БитБ Или БитПереноса) И Не НовыйБитПереноса Или БитА И БитБ И БитПереноса;Таким образом, последовательно выполняя поразрядное сложение двух чисел (аналог "столбика"), мы найдем все биты суммы этих чисел. Реализуем этот алгоритм для однобайтных чисел, воспользовавшись платформенными функциями работы с двоичными данными.
Функция ДвоичнаяСумма(Знач А, Знач Б)
Сумма = 0;
БитПереноса = Ложь;
Для НомерБита = 0 По 7 Цикл
БитА = ПроверитьБит(А, НомерБита);
БитБ = ПроверитьБит(Б, НомерБита);
НовыйБитПереноса = БитА И БитБ Или (БитА Или БитБ) И БитПереноса;
БитСумма = (БитА Или БитБ Или БитПереноса) И Не НовыйБитПереноса Или БитА И БитБ И БитПереноса;
БитПереноса = НовыйБитПереноса;
Сумма = УстановитьБит(Сумма, НомерБита, БитСумма);
КонецЦикла;
Возврат Сумма;
КонецФункции
