l

Шестнадцатеричная арифметика

12.03.2009 135472 Пишу 40 комментариев компьютерная теория

Дорогие друзья, спасибо всем, кто отписался в этой статье. Откровенно говоря, когда я её писал, то не задумывался о том, что она будет так популярна (самая популярная статья на этом сайте). Видимо в самом деле стоит дописать её, чтобы полнее осветить тему. Какие-то куски старой статьи останутся здесь без изменения, что-то я дополню, еще что-то — перепишу. Итак, приступим.

Как перевести шестнадцатеричное число в десятичное?

Всё не так страшно, как может показаться в самом начале, и начнем мы с привычной всем нам десятичной арифметики. Во втором классе средней школы нас учили, например, что число 136, это — 100 + 30 + 6.

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

  1. В десятичной системе счисления всего десять цифр (чисел, записываемых одним символом) — от 0 до 9.
  2. Число десять — первое число, которое нельзя записать одной цифрой.
  3. Число десять является основанием десятичной системы счисления.

Поясню эти правила. С первым всё понятно. Второе: действительно, когда все числа из одной цифры исчерпаны, принято составлять числа из двух и более знаков (цифр): 10, 11, 12 и т. д. Чтобы проиллюстрировать третье правило, давайте вспомним о степенях — это сведения математики пятого класса средней школы. Чтобы возвести число А в степень х, необходимо число А умножить само на себя и множителей должно быть x штук. При этом А называется основанием степени, а х — показателем, записывается как Ах Вспомним ещё одно правило: любое число А в нулевой степени равно единице, то есть А0 = 1.

Теперь вернемся к нашему первому примеру — числу 136. Используя только что восстановленные в сознании правила, его можно записать так: 136 = 100 + 30 + 6 = 1×102 + 3×101 + 6×100.

Разряды чисел принято нумеровать справа налево и начинать при этом с нуля. Эти числа соответствуют показателям степеней, в которые надо возвести десятку в только что показанной записи. Приведем еще один пример — число 1375: 1375 = 1000 + 300 +70 + 5 = 1×103 + 3×102 + 7×101 + 5×100.

Понятно, что таким способом можно расписать любое целое десятичное число.

Настало время перейти к шестнадцатеричной системе счисления. Она тоже является позиционной, то есть цифры означают в ней разные числа в зависимости от разряда, в котором находятся. Шестнадцатеричная арифметика тоже подчиняется трём правилам, но они немного изменены для неё.

  1. В шестнадцатеричной системе счисления 16 цифр (чисел, которые можно записать одним символом). Это цифры от 0 до 9 и первые шесть символов латинского алфавита — A, B, C, D, E, F. Можно при записи использовать и прописные буквы a, b, c, d, e, f. Все эти цифры соответствуют десятичным числам от нуля до 15.
  2. Число, которое соответствует десятичному 16 — первое, которое нельзя записать одной цифрой. Проиллюстрируем это рядами чисел:

Таблица 1. Соответствие десятичных чисел шестнадцатеричным

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

  1. Шестнадцать — основание в своей системе счисления. То есть, расписывая в ней числа, нужно в степень возводить число 16, а не десятку, как мы привыкли. Это, кстати говоря, позволит нам узнать, чему равно то или иное шестнадцатеричное число.

Как, например, понять, чему равно шестнадцатеричное число FF? Распишем его по известному нам правилу. Вместо десятки подставим 16, а шестнадцатеричную цифру F заменим соответствующим ей десятичным числом 15. Итак: FF = F×161 + F×160 = 15×161 + 15×160 = 15×16 + 15 = 255.

Попробуем с другим числом, например, 1F5: 1F5 = 1×162 + F×161 + 5×160 = 162 + 15×16 + 5 = 501.

Подобная запись является правилом перевода шестнадцатеричных чисел в привычные нам десятичные. А можно ли десятичное число перевести в шестнадцатеричное? Конечно, да. Но, чтобы избежать путаницы, будем десятичные числа писать как прежде, а перед шестнадцатеричными числами будем ставить префикс «0x», что повсеместно принято для записи таких чисел в компьютере.

Как перевести десятичное число в шестнадцатеричное?

Чтобы перевести десятичное число в шестнадцатеричное, необходимо выполнить следующие действия:

  1. Проверяем, не меньше ли 16 наше число: если да, то результат достигнут. Действительно, такое десятичное число необходимо лишь заменить соответствующей ему шестнадцатеричной цифрой из таблицы 1. Если же наше десятичное число больше 16, переходим к шагу 2.
  2. Делим наше число НАЦЕЛО на 16 и запоминаем целочисленный остаток от этого деления. Результат этого деления снова сравниваем с 16. Если результат деления меньше 16, то его стоит тоже запомнить как последний из остатков.
  3. Шаг 2 повторяем до тех пор, пока результат деления не будет меньше 16. Целочисленные остатки на всех этапах запоминаем. Они понадобятся в шаге 4.
  4. Все остатки записываем в обратном порядке и заменяем в них числа от 10 до 15 шестнадцатеричными цифрами от a до f.

Проиллюстрируем эти правила примером.

Переведем десятичное число 89 в шестнадцатеричное. Оно больше 16, поэтому разделим его на 16. Частное равно 5 и 9 в остатке. 5 меньше 16, значит, деление прекращается и 5 запомним как последний остаток. То есть у нас есть два остатка: 9 и 5. Теперь их надо записать в обратном порядке, получаем: 89 = 0×59.

Проверим, действительно ли 0×59 равно 89? Распишем его по привычной уже схеме: 0×59 = 5×161 + 9×160 = 5×16 + 9 = 89.

Действительно, получилось. Но в выбранном мной примере число 89 очень быстро закончилось, если так можно сказать. В противном случае деление потребовалось бы продолжить. Покажем это на более сложном примере. Возьмем число 3728: 3728 / 16 = 233 и 0 в остатке. Затем 233 / 16 = 14 и 9 в остатке. Результат этого деления равен 14, он меньше 16. Деление заканчиваем и запоминаем этот результат деления как последний остаток. Нам осталось лишь записать эти остатки в обратном порядке и заменить десятичное число 14 на шестнадцатеричную цифру E. Итак, искомое число 0xE90.

В качестве домашнего задания можете перевести это число в десятичное и проверить, действительно ли 0xE90 равно 3728?

На этом месте статья заканчивалась, я решил ее несколько дополнить. Продолжаем.

Сложение шестнадцатеричных чисел

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

Сначала мы с вами вспомним как складывать числа в столбик в привычной нам десятичной системе счисления и применим эти знания на шестнадцатеричные числа. Всего делов-то! :)

Предположим, нам необходимо сложить числа 234 и 49. Для этого мы запишем эти числа одно под другим так, чтобы разряды в них совпадали — единицы под единицами, десятки под десятками и так далее. И складывать будем цифры из одинаковых разрядов, начиная с единиц и идя влево.

234
+
49
283

Помня о том, что мы пока складываем десятичные числа (10 является основанием системы счисления), складываем разряды по очереди справа налево. 4 + 9 = 13. Наш результат — 13, он больше 10 — нашего основания. В случае, когда результат больше или равен основанию, это самое основание нужно вычесть из результата. В нашем примере от 13 необходимо отнять 10, а новый результат записать под цифрами 4 и 9, отнятую же здесь десятку, перенести в левый разряд как единицу старшего разряда (десять единиц равно одному десятку). В разряде с десятков мы складываем 3 + 4 и добавляем к ним перенесенный 1 десяток. Результат — 8. Он меньше нашего основания, значит под десятками просто записываем 8. Далее складываем сотни. Но двойку не с чем складывать, значит просто переносим ее в результат. Итак: 234 + 49 = 283.

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

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

a = 10, b = 11, c = 12, d = 13, e = 14, f = 15.

Переходим собственно к примеру на сложение. Давайте сложим 0xA15 и 0xBC.

A15
+
BC
AD1

Сначала складываем единицы — 5 + С. Вспоминаем, что с = 12, получаем 5 + 12 = 17. Результат больше основания системы счисления, который равен 16. Значит вычитаем 16 из 17 — равно 1, записываем этот новый результат под правым разрядом, а в левый старший разряд переносим единичку (16 единиц равно одному десятку в шестнадцатеричной системе). Там же складываем 1 + B. Добавляем к этой сумме 1 перенесенный разряд и вспоминаем, что B = 11, получаем: 1 + 1 + 11 = 13. Во-первых: этот результат меньше 16, значит его можно просто записать под складываемыми цифрами, а во-вторых: Число 13 в шестнадцатеричной арифметике записывается буквой D. В разряд сотен при этом ничего не переносится, а цифра A из верхнего слагаемого просто переносится в результат. Несложно заметить, что 0xA15 + 0xBC = 0xAD1.

Вычитание шестнадцатеричных чисел

Начнем мы снова с привычной нам десятичной системы счисления. Давайте решим пример: 123-85.

123
85
38

Вычитание снова происходит поразрядно, но переносы делаются на сей раз слева направо. Поясню. В нашем примере необходимо из 3 отнять 5. Этого сделать нельзя, поэтому мы занимаем один десяток из левого разряда. Теперь 5 нужно отнять от 13. В результате мы получим 8, запишем этот результат под разрядом единиц. От десятков в уменьшаемом (число 123) мы один десяток заняли в разряд единиц. Теперь здесь только 1 десяток. Нам нужно из одного вычесть 8. Для этого снова приходится занять единицу из левого разряда (теперь уже сотен). Значит нужно из 11 вычесть 8. В результате получаем – 3 и записываем его под разрядом десятков. А единственную сотню мы заняли для вычитания десятков. Пример решён: 123-85 = 38.

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

a = 10, b = 11, c = 12, d = 13, e = 14, f = 15.

Давайте решим пример 0xBC4-0xAF.

BC4
AF
B15

Из 4 нельзя вычесть F, значит из левого разряда мы займем 16. Теперь F надо вычитать из 20. В результате — 5, записываем его под разрядом единиц. Цифра C уменьшилась на 1, теперь это B. Значит надо A вычесть из B. Нетрудно догадаться, что в результате будет 1. Записываем этот результат в разряде десятков. Из сотен в этот раз мы ничего не занимали и в вычитаемом только 2 цифры — сотен нет, то есть сносим B из уменьшаемого в результат. Итак: 0xBC4-0xAF = 0xB15, пример решен. Было ли сложно? :)

40 комментариев на «Шестнадцатеричная арифметика»

  1. Гость:

    Спасибо! Теперь все стало понятно и действительно просто

  2. Гость:

    Неплохо, но не все понял =)… надеюсь со временем дойдет

  3. Гость:

    Хм… Ну перейти с одной системы в другую несложно…
    Только вот в названии статьи написано Шестнадцатеричная АРИФМЕТИКА, тоесть нужно было еще добавить правила сложения и вычитания разных шетнадцатиричных чисел, а аткже обьяснить как переводить десятичные дроби в 16-ричную систему… Тоесть, автору еще есть что добавить =)

  4. Гость:

    Да, или допиши или название смени!

  5. Гость:

    блин а я вот как раз на сложение 16ичных посмореть хател

  6. Гость:

    Просто и толково.Спасибо.

  7. Гость:

    Что то я не пойму.. откуда остаток 9?

  8. Гость:

    Напишы как отрицательние числа предст. ветой системе.

  9. Гость:

    ТОЛКОВО

  10. Гость:

    откуда остаток 9, при делении 89 на 16 получается другое число, и как это при проверке все верно-то получилось

    • Фото аватара Володька Смирнов:

      Если 89 разделить НАЦЕЛО на 16, то в частном получится 5, так как 5 х 16 = 80 и в остатке будет именно 9.

  11. Гость:

    Спасибо, хорошая статья, правда логику так и не понял, пришлось изобретать велосипед самостоятельно :) Но направление мысли все-таки понял)

  12. Гость:

    Очень неплохо))) До этого читал несколько статей и учебник по инфе, но ничагошеньки не понял ;) А теперь всё понятно, и кажется совсем не трудным))) СПАСИБО!

  13. Гость:

    пример в конце статьи – кривой,написан непонятно(мое личное мнение)

  14. Фото аватара Володька Смирнов:

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

  15. Гость:

    Отличная статья! Списибо Автору!

  16. Гость:

    >Если 89 разделить НАЦЕЛО на 16, то в частном получится 5, так как 5 х 16 = 80 >и в остатке будет именно 9.

    А если наше число, скажем, 91?

    91 / 16 — целый остаток == 5.
    16 * 5 = 80
    91 – 80 = 11

    То есть остатки 5 и 11
    То еть 91 = 0x511

    Не сходится.

  17. Гость:

    Нет, я ошибся, все верно. 11 в HEX — это B.
    То есть 91 = 0x5B
    Все сходится :)

    • Фото аватара Володька Смирнов:

      Именно! В статье же сказано: 4. Все остатки записываем в обратном порядке и заменяем в них числа от 10 до 15 шестнадцатеричными цифрами от a до f.

  18. Гость:

    НЕ ПОНЯТНО

  19. Гость:

    спасибо,нобеля автору.

  20. Гость:

    статья хорошая, но арифметики не хватает)

  21. Гость:

    ерунда

  22. Dkfl:

    проще и доступнее не бывает. только понадобилось – сразу же нашёл и разобрался. благодарю!

    • Фото аватара Володька Смирнов:

      Что ж, приятно, что спустя годы эта статейка ещё актуальна и полезна.

  23. Иван:

    Спасибо большое вам очень помогло. ваша статья ещё не один год будет просматреваться пока существует такие вот исчисления.

    • Фото аватара Володька Смирнов:

      Возможно вы правы, Иван, но от этого не менее приятно получать отзывы.

  24. OKi:

    А деление где?

    • Фото аватара Володька Смирнов:

      А не выучив “таблицу умножения” с размерностью 15 на 15, умножать без калькулятора сможете? Уверены? Деление, лишь обратная к умножения операция.

  25. Алексей:

    Спасибо большое, очень помогло)))

  26. nan:

    Спасибо, как раз пригодится для калькулятора)))

  27. Gale:

    Здравствуйте!
    Спасибо за статью!
    Мне кажется, у вас опечатка в столбике последнего примера под чертой: “С” лишняя.
    Результат 0хВ15, а у вас там ВС15.

    • Фото аватара Володька Смирнов:

      Вы правы, спасибо. Раньше примеры не верстались, а добавлялись в статью в виде картинок. А вот когда я это изменил, вкралась опечатка. Спасибо за внимательность.

  28. Оксана:

    Спасибо, все доступно описано. Только стоит написать еще и о умножении и делении в шестнадцатеричной системе счисление. Особенно о делении. Нигде невозможно найти в рунете, а в учебниках только само действие без его описания.

    • Фото аватара Володька Смирнов:

      Оксана, умножение и деление для шестнадцатеричной арифметики ничем по механике не отличаются от привычной нам, десятичной. Всё то же и всё так же – в столбик. Другое дело, что для создания этой механики в уме, надо запомнить таблицу умножения. Только тут она имеет размерность 16х16. Вы в силах такую выучить и держать в уме? Если да, то умножать вы точно сможете легко. С делением, скорее всего возникнет чуть больше проблем. Тем не менее, описывать подобное, не имея желания учить таблицу умножения, я бы не хотел. Однако ничего сложного – составляете таблицу умножения, держите перед глазами, а действия выполняете как в привычной десятичной арифметике, с поправкой на то, что цифр – 16.

  29. Степан:

    Насколько я знаю C =12, и если мы из левого разряда занимаем 16, то на месте C остаётся “-4”, так что цифра C не уменьшится на 1.

    • Фото аватара Володька Смирнов:

      Я так понимаю, Степан, что вы говорите о последнем примере: BC4 – AF? C в уменьшаемом стоит в разряде десяток, занимаем мы единицу, стало быть – один десяток, сейчас не важно, что в шестнадцатеричной системе счисления 10 равно 16 в десятичной. По сути из C мы отнимаем один десяток – единицу. C – 1 = B. Считать в десятичных числах нам привычнее. Один десяток в шестнадцатеричной системе = 16 в десятичной, это я уже повторяюсь. 16 + 4 = 20 в десятичной, а F в десятичной равно 15. Вычитаем 20 – 15 = 5 – это число в разряде единиц. Далее в разряде десятков мы вычитаем B – A = 1, вычитаем из B, так как до этого из C отнимали здесь единицу, ну и так далее.

  30. Программирующая Кошара:

    Именно здесь впервые услышала, что в 16-ричной системе занимается 16, а не 10, и это моментально решило мои проблемы. Спасибо за такую простую истину)

    • Фото аватара Володька Смирнов:

      Ну, собственно термин “основание системы счисления” – он не просто так. Если система двоичная – занимается двойка, в восьмеричной – восемь и так далее. Рад, если моя старая статейка всё ещё полезна.

Оставьте ваш отзыв: