Каталог решений - Если хочется низко-низкоуровневого программирования с битами и байтами

Если хочется низко-низкоуровневого программирования с битами и байтами

Если хочется низко-низкоуровневого программирования с битами и байтами

В наличии

Все знают, что подавляющее большинство современных компьютеров работает в двоичном коде, т.е. оперирует всего двумя значениями — битами — «0» и «1». Потом из них складываются байты, слова, кило-, мега- и гигабайты etc. Но что происходит внутри процессора, как именно обрабатываются двоичные числа, например выполняются арифметические операции? Об этом — в публикации. Статья, я думаю, будет особенно интересна тем читателям, у которых во время обучения не было соответствующих курсов.

Категория:

Описание

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

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

Как известно, байт — это 8 бит. Количество различных чисел, которые можно задать с помощью 1 байта = 28 = 256: 010..25510 или 000000002..111111112. Первый бит, тот который крайний слева, называется старшим, последний, соответственно, младшим. Умножение числа на 2 (основание системы счисления), это просто дописывание в конце числа "0", или, что то же, сдвиг числа на один разряд в сторону старшего бита: 210 -> 410: 000000102 -> 000001002.  Аналогично, деление на 2 — сдвиг в обратную сторону.

Помните в 1 классе таблицу сложения? Так вот, в двоичной системе счисления она весьма невелика:

 

Бит АБит БСумма
0000
0101
1001
1110

 

 

В последней строке у нас получилось число 102, старший бит которого равен единице. При поразрядном сложении ("столбиком") больших чисел в двоичной системе этот бит переноса — то самое значение, которое "в уме" ("ноль пишем, один в уме"). Он будет участвовать в сложении следующих разрядов:

 

Бит переноса

предыдущего

сложения

Бит АБит БСумма
00000
00101
01001
01110
10001
10110
11010
11111

 

 

Вот сложение 2310 + 2910 = 5210

 

  00010111  
+ 00011101 
= 00110100

 

Реалии цифровой электроники таковы, что на полупроводниковой элементной базе легко воспроизвести булевы функции — И, ИЛИ, НЕ. Также легко реализуются поразрядные сдвиги влево и вправо.

Вот схематичные примеры электронных схем на транзисторах (источник — яндекс-картинки):

 

 

Представив "1" и "0" как "Истина" и "Ложь" легко эмулировать сложение двух бит логическими функциями.

Для первой таблицы (без учета бита переноса предыдущего сложения):

БитПереноса = БитА И БитБ;
БитСумма = (БитА И Не БитБ) Или (Не БитА И БитБ);

С учетом предыдущего бита переноса:

НовыйБитПереноса = БитА И БитБ Или (БитА Или БитБ) И  БитПереноса;
БитСумма = (БитА Или БитБ Или БитПереноса) И Не НовыйБитПереноса Или БитА И БитБ И БитПереноса;

Таким образом, последовательно выполняя поразрядное сложение двух чисел (аналог "столбика"), мы найдем все биты суммы этих чисел. Реализуем этот алгоритм для однобайтных чисел, воспользовавшись платформенными функциями работы с двоичными данными.

Функция ДвоичнаяСумма(Знач А, Знач Б)
	Сумма = 0;
	БитПереноса = Ложь;	
	Для НомерБита = 0 По 7 Цикл  
		БитА = ПроверитьБит(А, НомерБита);
		БитБ = ПроверитьБит(Б, НомерБита);
		НовыйБитПереноса = БитА И БитБ Или (БитА Или БитБ) И  БитПереноса;
		БитСумма = (БитА Или БитБ Или БитПереноса) И Не НовыйБитПереноса Или БитА И БитБ И БитПереноса;
		БитПереноса = НовыйБитПереноса;
		Сумма = УстановитьБит(Сумма, НомерБита, БитСумма);
	КонецЦикла; 		
	Возврат Сумма;
КонецФункции 

 

 

has been added to your cart:
Оформление заказа