(←) предыдущая запись ; следующая запись (→)
образовательное, программистское
Мне неловко в этом признаваться, но меня восхищают иногда совершенно тривиальные вещи. И не перестают восхищать спустя годы.
———
Вот, например, все изучают, как в компьютере числа записываются в двоичном коде. Нужно просто разложить число в сумму степеней двойки Ну например:
`45 = 32 + 8 + 4 + 1 =
= … + 0 × 256 + 0 × 128 + 0 × 64 +
+ 1 × 32 + 0 × 16 + 1 × 8 +
+ 1 × 4 + 0 × 2 + 1 × 1 =
= (..000101101)
Окей, число
45все знают, как записать. Но мало кто знает как бы закодировать в двоичном коде число
-45`.
Знак «минус» в процессор не засунешь, туда только нолики и единички можно записывать.
Первая мысль такая: знаки «плюс» и «минус» можно закодировать ноликом и единичкой.
Например, будем записывать число в один байт, т.е. восемь бит. Семь битов оставим под двоичную запись, а перед ними один бит возьмём как знак.
Тогда:
+45 = (00101101)
-45 = (10101101)
```Казалось бы, тривиальное решение. Настолько тривиальное, что его называют «прямой код», и писать о нём пост было бы глупо даже по меркам моего излишнего умения удивляться.
Но... В прямом коде числа в компьютере стараются не писать.
Почему?! Потому что теперь у нас есть две *разных* двоичных записи для числа 0:
`+0 = (00000000)
-0 = (10000000)
`*Про ещё один код, называемый «обратным» я умолчу. Он по своему интересен, но обладает той же проблемой.
*———
А вот [дополнительный код](https://ru.wikipedia.org/wiki/Дополнительный_код) мне кажется очень красивым. Я не знаю истории его появления, скорее всего изначально, это был инженерный трюк. Но для меня ноги этого кодирования растут из математического определения [группы](https://ru.wikipedia.org/wiki/Группа_(алгебра)) по сложению.
*Я не буду сейчас пересказывать теорию групп, просто поверьте, что это очень простой и бесконечно мощный алгебраический объект, с которым вы сталкивались тысячу раз, даже не замечая этого: группы образуются из обычных чисел, из симметрий кристаллов, из геометрических преобразований, из матриц. Даже циферблат часов можно представлять себе как группу
*Что такое число `-45` с точки зрения теории групп? Это *«число, обратное по сложению»* числу `45`.
То есть такое число, что при сложении с числом `45`, даёт ноль.
Давайте для начала посмотрим на число `-1` и поймём, что бы такое прибавить к `1`, чтобы получить ноль. Напишу сразу ответ:
00000001
+
11111111
100000000
Итак, `-1 = (11111111)
`Красота же!
Чтобы посчитать число `-45`, мы перевернём все биты числа `45` на противоположные (инвертируем число) и прибавим к получившемуся числу `1`:
45 = (00101101)
~45 = (11010010)
-45 = (11010011)
Кстати, подобное представление отрицательных чисел встречается и в [p-адических](https://habr.com/ru/articles/645939/) числах, но это уже совсем другая история.