Найти в Дзене

Переводим длинные числа в двоичную систему.

Оглавление

Всем привет, меня зовут Андрей, это снова я!

Как перевести достаточно длинное число из десятичной системы в двоичную? В эксель, конечно, есть функция

ДЕС.В.ДВ()

но эта функция работает с теми числами, которые не превышают 511, то есть 2 в девятой степени минус 1. А как быть, если нужно перевести число, которое намного больше, чем 511? Сейчас рассмотрим.

  • Допустим, что надо перевести число, в котором тридцать восьмерок (888...888), всего этих восьмерок ровно тридцать штук, из десятичной системы в двоичную.

1. Вначале длинное число разделим на 512 [потому что, во-первых, 512 это есть 2 в девятой степени, и, во-вторых, остаток любого числа при делении на 512 будет настолько маленьким, что его можно будет очень просто перевести в двоичную систему с помощью эксель]; вычислим и целую часть, полученную при делении, и остаток при делении на 512 (о том макросе, который позволяет применить деление для длинных чисел, я расскажу в одной из следующих статей; здесь же речь идет исключительно о переводе длинных [и не только длинных] чисел из десятичной системы счисления в двоичную):

[888888888888888888888888888888 / 512] = 1736111111111111111111111111, остаток 56.

Напомню, что квадратные скобки в математике обычно означают целую часть числа.

2. Затем полученный остаток (56) переведем из десятичной системы в двоичную. Получим 111000.

3. Вычислим количество цифр (знаков) в полученном остатке; если оно меньше, чем 9, то нужно добавить столько нулей слева, чтобы в сумме получилось ровно 9 знаков. В нашем конкретном примере нужно прибавить ровно 3 ноля слева, получим: 000111000. Это и будет "хвост" конечного результата, его последние 9 цифр.

Кстати, любое число в десятичной системе, если оно не больше, чем 511, но и не меньше, чем 256, всегда будет иметь ровно 9 знаков в двоичной системе счисления. Поэтому все числа, которые меньше либо равны числу 255 в десятичной системе, будут иметь 8 цифр и менее в двоичной системе счисления.

4. Затем возьмем ту целую часть числа, что мы получили еще на первом этапе расчетов, и снова разделим на 512:

[1736111111111111111111111111 / 512] = 3390842013888888888888888, остаток 455 (111000111).

5. Полученное на предыдущем этапе число в двоичной системе проверим: сколько в нем знаков, нужно ли добавлять нули слева. Здесь 9 цифр, добавлять нули слева не нужно. Нужное нам число оставим без изменения: 111000111. Все это число добавим слева к тому результату, что был получен ранее на предыдущих этапах расчета.

Таким образом, на данном этапе расчета мы получим следующие цифры конечного результата (для удобства восприятия выделим жирным шрифтом первую цифру в каждой группе из девяти цифр, ведь мы на каждом из этапов получаем именно такую группу цифр:

111000111000111000

6. Снова берем целую часть числа, полученного при делении на предыдущем этапе, и опять ее делим на 512:

[3390842013888888888888888 / 512] = 6622738308376736111111, остаток 56.

Поскольку такой остаток уже встречался в нашем примере, мы можем быстро перевести число 56 в двоичную систему так, чтобы было в сумме 9 знаков, это число 000111000. Все эти 9 цифр нужно добавить слева к тому результату, что был на предыдущем этапе.

Таким образом, на данном этапе расчета мы получим следующие цифры конечного результата:

000111000111000111000111000

7. Опять возьмем целую часть числа, полученного при делении на предыдущем этапе, и опять ее делим на 512 (мы это будем повторять несколько раз до тех пор, пока не получим, что целая часть будет меньше, чем 512).

Итак, [6622738308376736111111 / 512] = 12935035758548312717, остаток 7. Семерка в двоичной системе - это 111, добавим 6 нолей слева, получим 000000111. Прибавим весь этот массив слева к тому результату, что был получен на предыдущем этапе, и получим:

000000111000111000111000111000111000

8. Поскольку многие последующие пункты алгоритма очень похожи один на другой, разница только в самих цифрах, то далее я приведу только основные действия, которые нужно производить для расчетов:

  • [12935035758548312717 / 512] = 25263741715914673, остаток 141 (010001101), результат на данном этапе
    010001101000000111000111000111000111000111000
  • [25263741715914673 / 512] = 49343245538895, остаток 433 (110110001),
    результат на данном этапе
    110110001010001101000000111000111000111000111000111000
  • [49343245538895 / 512] = 96373526443, остаток 79 (001001111),
    результат на данном этапе
    001001111110110001010001101000000111000111000111000111000111000
  • [96373526443 /512] = 188229543, остаток 427 (110101011),
    результат на данном этапе
    110101011001001111110110001010001101000000111000111000111000111000111000
  • [188229543 / 512] = 367635, остаток 423 (110100111),
    результат на данном этапе
    110100111110101011001001111110110001010001101000000111000111000111000111000111000
  • [367635 / 512] = 718, остаток 19 (000010011),
    результат на данном этапе
    000010011110100111110101011001001111110110001010001101000000111000111000111000111000111000
  • [718 / 512] = 1, остаток 206 (011001110),
    результат на данном этапе
    011001110000010011110100111110101011001001111110110001010001101000000111000111000111000111000111000

Остается завершающий этап: ту единицу, что является целой частью при делении 718 на 512, нужно перевести в двоичную систему (это и будет единицей); на данном этапе нули слева добавлять не надо. То есть: к полученному на предыдущем этапе результату нужно прибавить единицу слева (1).

Итак, наш конечный результат:
1011001110000010011110100111110101011001001111110110001010001101000000111000111000111000111000111000

Кстати, можно пойти немного другим путем, делить большое число на каждом этапе не на 512, а на квадрат числа 512, то есть на 262144; снова нужно получать и остаток, и целую часть числа, полученного при делении.

Тогда на каждом из этапов нужно этот остаток при делении на 262144 вначале делить на 512, и тогда остаток (при делении на 512) пойдет "в правую часть хвоста", а целое - "в левую часть хвоста".

Приведем конкретный пример, возьмем число поменьше, чем было в предыдущем случае. Переведем десять пятерок в двоичную систему:

1. [5555555555 / 262144] = 21192, остаток 199907.

2. Делим на 512 аналогичным образом число 199907:

[199907 / 512] = 390, остаток 227.

Теперь переведем и 390, и 227 в двоичную систему, не забывая о принципе "девяти знаков":

390 - это 110000110, 227 - это 011100011.

3. Вначале в "правую" часть "хвоста" записываем код остатка, то есть 011100011, затем прибавляем слева код целого, то есть 110000110, получим на этом этапе сначала код целого, затем код остатка, то есть: 110000110011100011 (можно выделить жирным первую цифру этого блока в 18 цифр).

4. Теперь берем целую часть при делении числа 5555555555 на 262144, то есть число 21192. Если бы в другом примере при других цифрах это число было бы больше, чем 262144, мы бы его снова разделили на 262144, но оно у нас меньше этого числа. Поэтому разделим только на 512:

[21192 / 512] = 41, остаток 200.

Далее все произойдет уже по готовой и известной схеме. И 41 в двоичной системе, и 200 в двоичной системе можно представить как единый блок.

Сперва переводим 200 в двоичную систему с учетом девяти знаков. Таким образом, 200 превратится в 011001000.

Потом останется только число 41, его надо переводить в двоичную систему "как есть", без добавления нулей слева, потому что речь идет о начале длинного числа, левее его уже других цифр не будет. Итак, 41 превратится в 101001. А на всём этом этапе мы получим: 101001011001000, прибавим этот весь блок слева к тому, что было раньше, и тогда получим:
101001011001000110000110011100011,
это и будет наш конечный ответ, то есть: число 5555555555 (в десятичной системе), переведенное в двоичную систему счисления.

А на этом пока всё, и до новых встреч!