Одарите меня рублём
ЯндексЯндекс. ДеньгиХочу такую же кнопку

Пишу

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

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

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

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

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

2. Число десять — первое число, которое нельзя записать одной цифрой.

 3. Число десять является основанием десятичной системы счисления.

 Поясню эти правила. С первым всё понятно. Второе: действительно, когда все числа из одной цифры исчерпаны, принято составлять числа из двух и более знаков (цифр): 10, 11, 12 и т. д. Чтобы проиллюстрировать третье правило, давайте вспомним о степенях — это сведения математики пятого класса средней школы. Чтобы возвести число А в степень х, необходимо число А умножить само на себя х раз. При этом А называется основанием степени, а х — показателем, записывается как Ах Вспомним ещё одно правило: любое число А в нулевой степени равно единице, то есть А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. Соответсвие десятичных чисел шестнадцатиричным

Десятичные

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

Шестнадцатиричные

0

1

2

3

4

5

6

7

8

9

a

b

c

d

e

f

10

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

3. Шестнадцать — основание в своей системе счисления. То есть, расписывая в ней числа, нужно в степень возводить число 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?

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


Комментарии:


Гость (27.09.2009 20:01)
Спасибо! Теперь все стало понятно и действительно просто

Гость (01.10.2009 15:48)
Неплохо ,но не все понял =)...надеюсь со временем дойдет

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

Гость (07.12.2009 20:28)
Да, или допиши или название смени!

Гость (21.01.2010 23:20)
блин а я вот как раз на сложение 16ичных посмореть хател

Гость (22.01.2010 09:48)
Просто и толково.Спасибо.

Гость (30.01.2010 18:59)
Что то я не пойму.. откуда остаток 9?

Гость (31.01.2010 15:30)
Напишы как отрицательние числа предст. ветой системе.

Гость (13.02.2010 06:23)
ТОЛКОВО

Гость (28.03.2010 22:06)
откуда остаток 9, при делении 89 на 16 получается другое число, и как это при проверке все верно-то получилось

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

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

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

Гость (20.05.2010 21:46)
пример в конце статьи - кривой,написан непонятно(мое личное мнение)

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

Гость (29.06.2010 02:53)
Отличная статья! Списибо Автору!

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

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

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

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

Не сходится.

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

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

Гость (15.09.2010 21:17)
НЕ ПОНЯТНО

Гость (28.06.2011 10:29)
спасибо,нобеля автору.

Гость (07.09.2011 12:14)
статья хорошая, но арифметики не хватает)

Гость (03.10.2011 18:32)
ерунда



Яндекс цитирования


При использовании материалов ссылка на сайт обязательна.
Design by Vladimir N. Smirnov. © 2007—2012