bin_dec_hex - справочное руководство, опции, примеры команд


ИМЯ

bin_dec_hex - Как использовать двоичную, десятичную и шестнадцатеричную систему счисления.

ОПИСАНИЕ

Большинство людей используют десятичную систему счисления. Эта система использует десять символов для представления чисел. Когда эти десять символов израсходованы, они начинают все сначала и увеличивают позицию влево. Цифра 0 отображается только в том случае, если это единственный символ в последовательности или если он не первый.

Если это звучит для вас загадочно, вот что я только что сказал в цифрах:

            0
            1
            2
            3
            4
            5
            6
            7
            8
            9
           10
           11
           12
           13

и так далее.

Каждый раз, когда цифра девять увеличивается, она сбрасывается на 0, а позиция перед ней (слева) увеличивается (от 0 до 1). Тогда число 9 можно рассматривать как 00009, и когда мы должны увеличить 9, мы сбрасываем его на ноль и увеличиваем цифру непосредственно перед 9, чтобы число стало 00010. Начальные нули мы не пишем, за исключением случаев, когда это единственная цифра (число). 0). И, конечно же, мы пишем нули, если они встречаются где-либо внутри или в конце числа:

"00010" -> " 0010" -> " 010" -> "  10"

но нет

"  1 ".

Это было довольно просто, вы уже это знали. Зачем я это сказал? Ну, компьютеры обычно не представляют числа с 10 разными цифрами. Они используют только два разных символа, а именно 0 и 1. Примените те же правила к этому набору цифр, и вы получите двоичную систему счисления:

            0
            1
           10
           11
          100
          101
          110
          111
         1000
         1001
         1010
         1011
         1100
         1101

и так далее.

Если вы посчитаете количество строк, вы увидите, что это снова 14 разных чисел. Цифры те же и означают то же, что и в первом списке, просто мы использовали другое представление. Это означает, что вы должны знать используемое представление или, как его называют, систему нумерации или базу. Обычно, если мы явно не указываем используемую систему счисления, мы неявно используем десятичную систему. Если мы хотим использовать любую другую систему нумерации, мы должны это четко указать. Для этого есть несколько широко распространенных методов. Одной из распространенных форм является запись 1010(2), что означает, что вы записали число в его двоичном представлении. Это число десять. Если бы вы написали 1010 без указания основания, число интерпретировалось бы как одна тысяча десять с основанием 10.

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

Поскольку используемая система счисления также называется основанием, мы говорим о числе 1100 по основанию 2, о числе 12 по основанию 10.

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

Мы можем использовать двоичную форму при общении с компьютерами (... программирование...), но числа будут иметь большое представление. Число 65'535 (часто в десятичной системе ' используется для разделения блоков из трех цифр для удобства чтения) будет записано как 11111111111111111 (2), что в 16 раз больше цифры 1. Это сложно и подвержено ошибкам. Поэтому мы обычно использовали бы другую базу, называемую шестнадцатеричной. Он использует 16 различных символов. Сначала используются символы десятичной системы счисления, затем мы переходим к алфавитным символам. Мы получаем 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E и F. Эта система выбрана потому, что шестнадцатеричная форма может быть очень легко преобразована в двоичную систему. легко (и обратно).

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

        Binary      (2)
        Octal       (8)
        Decimal     (10)
        Hexadecimal (16)

        (2)    (8) (10) (16)
        00000   0    0    0
        00001   1    1    1
        00010   2    2    2
        00011   3    3    3
        00100   4    4    4
        00101   5    5    5
        00110   6    6    6
        00111   7    7    7
        01000  10    8    8
        01001  11    9    9
        01010  12   10    A
        01011  13   11    B
        01100  14   12    C
        01101  15   13    D
        01110  16   14    E
        01111  17   15    F
        10000  20   16   10
        10001  21   17   11
        10010  22   18   12
        10011  23   19   13
        10100  24   20   14
        10101  25   21   15

Большинство компьютеров, используемых в настоящее время, используют 8-битные байты. Это означает, что они хранят восемь битов за раз. Вы можете понять, почему восьмеричная система не самая практичная для этого: вам понадобятся три цифры для представления восьми битов, а это означает, что вам придется использовать одну полную цифру для представления только двух битов (2+3+3). =8). Это пустая трата. Для шестнадцатеричных цифр вам нужны только две цифры, которые используются полностью:

        (2)      (8)  (10) (16)
        11111111 377  255   FF

Вы можете видеть, почему двоичные и шестнадцатеричные числа могут быть преобразованы быстро: для каждой шестнадцатеричной цифры есть ровно четыре двоичных цифры. Возьмем двоичное число: возьмем четыре цифры справа и составим из них шестнадцатеричную цифру (см. таблицу выше). Повторяйте это до тех пор, пока не останется цифр. И наоборот: возьмите шестнадцатеричное число. Для каждой цифры запишите ее двоичный эквивалент.

Компьютерам (точнее, парсерам, работающим на них) было бы трудно преобразовать число вроде 1234(16). Поэтому шестнадцатеричные числа указываются с префиксом. Этот префикс зависит от языка, на котором вы пишете. Некоторые из префиксов: 0x для C, $для Pascal, # для HTML. Принято считать, что если число начинается с нуля, оно восьмеричное. Неважно, что используется, если вы знаете, что это такое. Я буду использовать 0x для шестнадцатеричных, % для двоичных и 0 для восьмеричных. Следующие числа все одинаковые, отличается только их представление (база): 021 0x11 17 %00010001

Чтобы заниматься арифметикой и преобразованиями, вам нужно понять еще одну вещь. Это то, что вы уже знаете, но, возможно, еще не видите:

Если вы записываете 1234 (без префикса, так что это десятичное число), вы говорите о числе одна тысяча двести тридцать четыре. В виде формулы:

        1 * 1000 = 1000
        2 *  100 =  200
        3 *   10 =   30
        4 *    1 =    4

This can also be written as:

        1 * 10^3
        2 * 10^2
        3 * 10^1
        4 * 10^0

где ^означает степень.

Мы используем основание 10 и позиции 0,1,2 и 3. Крайняя правая позиция НЕ ДОЛЖНА умножаться на 10. Вторая справа должна быть умножена один раз на 10. Третья справа умножается с 10 два раза. Это продолжается для любых позиций, используемых.

То же самое и во всех других представлениях:

0x1234 будет

        1 * 16^3
        2 * 16^2
        3 * 16^1
        4 * 16^0

01234 would be

        1 * 8^3
        2 * 8^2
        3 * 8^1
        4 * 8^0

Этот пример нельзя выполнить для двоичной системы, поскольку в этой системе используются только два символа. Другой пример:

%1010 будет

        1 * 2^3
        0 * 2^2
        1 * 2^1
        0 * 2^0

Было бы проще преобразовать его в шестнадцатеричный вид и просто перевести %1010 в 0xA. Через некоторое время к этому привыкаешь. Вам больше не нужно будет делать никаких вычислений, просто знайте, что 0xA означает 10.

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

Сначала нужно узнать, сколько позиций будет использоваться в другой системе. Для этого вам нужно знать максимальные числа, которые вы будете использовать. Что ж, это не так сложно, как кажется. В десятичном формате максимальное число, которое можно составить из двух цифр, равно 99. Максимальное число из трех: 999. Следующему числу потребуется дополнительная позиция. Переверните эту идею, и вы увидите, что число можно найти, взяв 10 ^3 (10 * 10 * 10 равно 1000) минус 1 или 10 ^2 минус один.

Это можно сделать и для шестнадцатеричных:

        16^4 = 0x10000 = 65536
        16^3 =  0x1000 =  4096
        16^2 =   0x100 =   256
        16^1 =    0x10 =    16

Если число меньше 65 536, оно поместится на четырех позициях. Если число больше 4'095, вы должны использовать позицию 4. Сколько раз вы можете вычесть 4'096 из числа, не опускаясь ниже нуля, это первая цифра, которую вы записываете. Это всегда будет число от 1 до 15 (от 0x1 до 0xF). Сделайте то же самое для других позиций.

Попробуем с 41'029. Это меньше, чем 16 ^4, но больше, чем 16 ^3-1. Это означает, что мы должны использовать четыре позиции. Мы можем вычесть 16 ^3 из 41 029 десять раз, не опускаясь ниже нуля. Следовательно, самая левая цифра будет A, поэтому у нас есть 0xA????. Число уменьшается до 41 029 - 10 * 4 096=41 029 - 40 960=69. 69 меньше 16^3, но не больше 16^2-1. Таким образом, вторая цифра равна 0, и теперь у нас есть 0xA0??. 69 меньше 16^2 и больше 16^1-1. Мы можем вычесть 16^1 (это просто 16) четыре раза и записать 4, чтобы получить 0xA04?. Вычтите 64 из 69 (69 - 4*16), и последняя цифра будет 5 --> 0xA045.

Другой метод строит число справа. Попробуем еще раз 41'029. Разделите на 16 и не используйте дроби (только целые числа).

41029/16 равно 2564 с остатком 5. Запишите 5. 2564/16 равно 160 с остатком 4. Запишите 4 перед 5. 160/16 равно 10 без остатка. Перед 45 добавьте 0. 10/16 меньше единицы. Закончите здесь и добавьте 0xA. В итоге 0xA045.

Какой метод использовать, решать вам. Используйте все, что работает для вас. Я использую их оба, не имея возможности сказать, какой метод я использую в каждом случае, я думаю, это просто зависит от числа. Дело в том, что некоторые числа будут часто встречаться при программировании. Если число близко к тому, с которым я знаком, то я буду использовать первый метод (например, 32'770, что составляет 32'768 + 2, и я просто знаю, что это 0x8000 + 0x2=0x8002).

Для бинарного можно использовать тот же подход. База 2, а не 16, и количество позиций будет быстро расти. Использование второго метода имеет то преимущество, что вы можете очень легко увидеть, следует ли записывать ноль или единицу: если вы делите на два, остаток будет равен нулю, если это четное число, и единице, если это нечетное число:

        41029 / 2 = 20514 remainder 1
        20514 / 2 = 10257 remainder 0
        10257 / 2 =  5128 remainder 1
         5128 / 2 =  2564 remainder 0
         2564 / 2 =  1282 remainder 0
         1282 / 2 =   641 remainder 0
          641 / 2 =   320 remainder 1
          320 / 2 =   160 remainder 0
          160 / 2 =    80 remainder 0
           80 / 2 =    40 remainder 0
           40 / 2 =    20 remainder 0
           20 / 2 =    10 remainder 0
           10 / 2 =     5 remainder 0
            5 / 2 =     2 remainder 1
            2 / 2 =     1 remainder 0
            1 / 2 below 0 remainder 1

Запишите результаты справа налево: %1010000001000101

Сгруппировать по четыре:

        %1010000001000101
        %101000000100 0101
        %10100000 0100 0101
        %1010 0000 0100 0101

Преобразовать в шестнадцатеричный: 0xA045

Сгруппируйте %1010000001000101 по три и преобразуйте в восьмеричное:

        %1010000001000101
        %1010000001000 101
        %1010000001 000 101
        %1010000 001 000 101
        %1010 000 001 000 101
        %1 010 000 001 000 101
        %001 010 000 001 000 101
           1   2   0   1   0   5 --> 0120105

        So: %1010000001000101 = 0120105 = 0xA045 = 41029
        Or: 1010000001000101(2) = 120105(8) = A045(16) = 41029(10)
        Or: 1010000001000101(2) = 120105(8) = A045(16) = 41029

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

           %1010 + %0111 --> 10 + 7 --> 17 --> %00010001

станет

           %1010
           %0111 +
            ||||
            |||+-- add 0 + 1, result is 1, nothing to remember
            ||+--- add 1 + 1, result is %10, write down 0 and remember 1
            |+---- add 0 + 1 + 1(remembered), result = 0, remember 1
            +----- add 1 + 0 + 1(remembered), result = 0, remember 1
                   nothing to add, 1 remembered, result = 1
        --------
          %10001 is the result, I like to write it as %00010001

Для низких значений попробуйте произвести расчеты самостоятельно, затем проверьте их с помощью калькулятора. Чем больше вы будете производить расчеты самостоятельно, тем больше вы обнаружите, что не допустили ошибок. В конце концов, вы будете выполнять исчисления в других системах счисления так же легко, как и в десятичных.

Когда цифры станут больше, вам придется понять, что компьютер называется компьютером не только из-за красивого имени. Есть много разных калькуляторов, используйте их. Для Unix вы можете использовать bc, что является сокращением от Binary Calculator. Он вычисляет не только в десятичном формате, но и во всех основаниях, которые вы когда-либо захотите использовать (включая двоичные).

Для пользователей Windows: Запустите калькулятор (Пуск->Программы->Стандартные->Калькулятор) и при необходимости нажмите вид->научный. Теперь у вас есть научный калькулятор, и вы можете выполнять вычисления в двоичном или шестнадцатеричном формате.

АВТОР

Надеюсь, вам понравились примеры и их описания. Если вы это сделаете, помогите другим людям, указывая им на этот документ, когда они задают основные вопросы. Они не только получат свой ответ, но в то же время узнают гораздо больше.

Алекс ван ден Богэрдт alex@vandenbogaerdt.nl