Шестнадесетичните числа

Шестнадесетична бройна система

Както всяка бройна система, шестнадесетичната също съдържа набор от символи, с които да се представят числата в нея. За разлика от десетичната система, с която сме свикнали да пресмятаме, тук се ползват освен цифрите от 0 до 9, също и няколко букви от латинската азбука: A, B, C, D, E и F, които изразяват стойности от 10 до 15.

hexadecimal numbers

Шестнадесетичната система е позиционна, както десетичната. Това означава, че стойността на отделната цифра зависи от мястото, на което се намира тя в рамките на дадено число.

За сравнение, римската бройна система е непозиционна. Ако вземем цифрата V, тя продължава да означава 5, когато я видим в число като VI например. Просто по правилата на римската бройна система, добавяме към V по-малката стойност на цифрата I след него, затова VI има стойност 6, а не 51. Напротив, според десетичната бройна система, която е позиционна, цифрата 5 в числото 51 обозначава десетиците, съответно нейната стойност не е 5, а 50.

Основата при шестнадесетичната бройна система е числото 16. Знаем, че за основа на дадена бройна система се приема онова число (с абсолютна стойност, различна от 0 и 1), което се равнява на броя цифри в тази система, използвани за запис на отделните числа в нея. Шестнадесетичната система използва 16 символа, за да представи записите на отделните числа. При десетичната система символите са 10 (от 0 до 9 включително).

Приложение на HEX числата

color wheelДвоичното представяне на числата е много удобно за компютърните пресмятания. За съхранение на данните в оперативната памет, се ползва двоичен код. Но въпреки, че двоичната бройна система се е наложила при компютрите, тя има и един недостатък: числата там нарастват много бързо и съответно заемат твърде много битове (разреди) в компютърната памет. Освен това, са неудобни за ползване от човека.

Шестнадесетичната система решава проблема с дългите записи, тъй като позволява да се работи по-лесно с големи числа. Изписването на числата в шестнадесетичен формат е доста по-кратко. IPv6 адресите се представят в шестнадесетичен формат, както и физическите адреси на компютрите. Записан в двоичен вид, физическият адрес би заел цели 48 бита, което би затруднило филтрирането на MAC адресите при безжичните връзки.

За обозначаване на цветовете също може да се ползва шестнадесетичен код. Код на всеки желан цвят може да генерирате от тук.

Особености на шестнадесетичния запис

Шестнадесетичните числа са поредица от цифри и (или) букви. Когато числото се състои само от цифри, пред тях се поставя идентификатор 0x, който обозначава числото като шестнадесетично, например: 0x56 не е равнозначно на десетичното число 56. Друг начин за обозначение е с индекс долу вдясно до числото, който показва бройната система, в която е числото: 56HEX.

Всяка шестнадесетична цифра/буква се представя като група от 4 бита, със съответни двоични стойности (0 или 1) на всяка от четирите позиции. Позициите се броят отдясно-наляво, като степени на двойката от нулева до трета: 20 = 1; 21 = 2; 22 = 4; 23 = 8.

group of 4 bits

Примери:

Числото AHEX има двоичен запис 1010 и десетична стойност 10, която получаваме при събиране на 8 + 2.

A-hex

Числото BHEX има двоичен запис 1010 и десетична стойност 11, която получаваме при събиране на 8 + 2 + 1.

B-hex

Числото CHEX има двоичен запис 1010 и десетична стойност 12, която получаваме при събиране на 8 + 4.

C-hex

Числото DHEX има двоичен запис 1010 и десетична стойност 13, която получаваме при събиране на 8 + 4 + 1.

D-hex

Числото EHEX има двоичен запис 1010 и десетична стойност 14, която получаваме при събиране на 8 + 4 + 2.

E-hex

Числото FHEX има двоичен запис 1010 и десетична стойност 15, която получаваме при събиране на 8 + 4 + 2 + 1.

F-hex

Числото FAHEX има двоичен запис 1111 1010, където първата група битове 1111 има стойност 15 (F), а втората група битове 1010 има стойност 10 (A). Двете стойности се получават при събиране на включените битове (позициите с единица):

FA-hex

Преобразуване

Всяко число може да се преобразува от една бройна система в друга. Лесно можем да представяме шестнадесетичните числа в десетични, както и обратно, с помощта на двоичния им запис. За улеснение, можем да ползваме помощни таблици, както е показано по-долу, или да събираме и изваждаме степени на двойката.

Шестнадесетичен към десетичен формат

Първото, което правим с шестнадесетичното число, е да го разделим на сегменти, всеки от които да представим в двоичен вид.

Пример: C5HEX 

C5-hex

Цифрата C означава десетично 12. За да я видим в двоичен вид, включваме онези битови позиции от нулева до трета, при сбора на които ще получим 12. Това означава позиция 23 и 22, които се равняват съответно на 8 и 4. За по-бързо пресмятане в двоичен формат, можем да ползваме Помощна таблица 1. Същото правим и с цифрата 5: включваме позициите 22 и 20, чиито сбор (4 + 1) ни дава стойност 5.

Hex-to-Binary Table

След като сме получили, че двоичната стойност на C5 е 1100 0101, можем да преобразуваме двоичното число в десетично. За целта, събираме стойностите на включените битови позиции отдясно-наляво, отново като степени на двойката, но този път за цялата дължина на числото, а не поотделно за сегментите му:

C5-hex

Сумата е: 27 + 26 + 22 + 20 или 128 + 64 + 4 + 1 = 197

Пример: FFHEX

Разделяме числото на 2 сегмента, според броя на символите в него, и го преобразуваме в двоичен формат, а след това събираме включените битове (в случая всички са включени):

FF-hex

Десетичен формат: 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255

За по-лесно изчисление, можем да използваме Помощна таблица 2, която ни показва десетичната стойност на сумата от поредни включени битове, броени от 8-ми към 1-ви бит:

Consequtive bits Table

Таблицата ни дава готова калкулация на сумата от стойностите на поредни битове (вж. колонката СУМА).

Пример: двоичното 1110 0001 съдържа три поредни включени бита на позиции 8, 7 и 6, които ни дават стойност 224, и към нея прибавяме стойността на първия бит, която е 1. По този начин получаваме, че в двоичен формат числото е 225.

Таблицата може да е от полза и при пресмятане на по-дълги двоични числа, но там се добавя и стойността на включените битове от 9-та позиция нататък. Така например, при двоичното 10 1100 1000 калкулацията е, както следва: 512 + 192 + 8 = 712 (десетично).

2C8-hex

Десетичен към шестнадесетичен формат

Правим преобразуването от десетичен формат към шестнадесетичен също през двоичен запис.

Пример: 225 

Както видяхме от Помощна таблица 2, три поредни включени бита дават стойност 224: това са позиции 27 + 26 + 25. За да получим десетичното 225, трябва да включим още един бит, със стойност 1 и съответна степен на двойката 20.

Полученото двоично число 1110 0001 разделяме на сегменти от по 4 бита. За всеки от тях изчисляваме шестнадесетичния му еквивалент: първият сегмент 1110 е със стойност 8 + 4 + 2 = 14 (или съответно EHEX), а вторият 0001 е със стойност 1. За тази калкулация можем да си послужим и с Помощна таблица 1.

Е1-hex

Пример: 120

Осмата битова позиция, която е и седмата степен на двойката (27 = 128) е с твърде висока стойност, по-голяма от 120. Поради това, на тази позиция поставяме 0.

Позиция седма, която е шестата степен на двойката (26 = 64), е по-малка от 120, съответно там поставяме 1. Изваждаме 64 от числото: 120 – 64 = 56. Остатъкът е 56.

Позиция шеста, която е пета степен на двойката (25 = 32), е по-малка от остатъка 56, съответно и там поставяме 1. Изваждаме 32 от остатъка: 56 – 32 = 24. Новият остатък е 24.

Позиция пета, която е четвърта степен на двойката (24 = 16), е по-малка от остатъка 24, съответно и там поставяме 1. Изваждаме 16 от остатъка: 24 – 16 = 8. Новият остатък е 8.

Позиция четвърта, която е трета степен на двойката (23 = 8), е равна на остатъка 8, съответно и там поставяме 1. Изваждаме 8 от остатъка: 8 – 8 = 0. Нямаме нов остатък, затова на останалите три позиции поставяме нули.

Така двоичното число, което получаваме, е 0111 1000:

78-hex-binary

Нулите от лявата страна не се броят. За да преобразуваме бинарното число в шестнадесетично, отново го разделяме на сегменти от по 4 бита, като броим отдясно-наляво:

78-hex

Калкулираме стойностите на двата сегмента: 4 + 2 + 1 = 7 (от лявата страна) и 8 (от дясната страна). Шестнадесетичният запис на числото е 0x78.

Пример: 252

Виждаме от Помощна таблица 2, че 6 поредни включени бита ни дават точно числото 252: 128 + 64 + 32 + 16 + 8 + 4 = 252. Съответно, бинарният запис би бил:

FC-hex-binary

Преобразуваме двоичното число в шестнадесетично:

FC-hex

Калкулираме стойностите на двата сегмента: 8 + 4 + 2 + 1 = 15 или F (от лявата страна) и 12 или C (от дясната страна). Шестнадесетичният запис на числото е FC.

Пример: 620

Числото 620 надвишава стойността на осмата битова позиция, която е 128. Това означава, че бинарният запис ще се простира в по-дълъг набор от битове.

На девета позиция имаме стойност 256 (28), което също е по-малко от 620, затова продължаваме да разширяваме битовата редица.

На десета позиция имаме стойност 512 (29), отново по-малко от 620.

На единадесета позиция стойността е 1024, което вече надхвърля числото 620. Така разбираме, че бинарният запис на нашето число ще съдържа общо 10 битови позиции:

26C-hex-binary

Разширили сме записите на двойката до битовата позиция на онази степен, която по стойност е максимално голямо число, равно или съдържащо се в 620.

Стойността на десетата битова позиция 512 (29) изваждаме от 620 и поставяме на тази позиция 1. Остатъкът е 620 – 512 = 108.

Стойността на деветата битова позиция 256 (28) е по-малка от остатъка 108, затова на тази позиция поставяме 0.

Стойността на осмата битова позиция 128 (27) също е по-малка от остатъка 108, затова и на тази позиция поставяме 0.

Стойността на седмата битова позиция 64 (26) изваждаме от остатъка 108 и поставяме на тази позиция 1. Новият остатък е 108 – 64 = 44.

Стойността на шестата битова позиция 32 (25) изваждаме от остатъка 44 и поставяме на тази позиция 1. Новият остатък е 44 – 32 = 12.

Стойността на петата битова позиция 16 (24) е по-малка от остатъка 12, затова на тази позиция поставяме 0.

Стойността на четвъртата битова позиция 8 (23) изваждаме от остатъка 12 и поставяме на тази позиция 1. Новият остатък е 12 – 8 = 4.

Стойността на третата битова позиция 4 (22) изваждаме от остатъка 4 и поставяме на тази позиция 1. Новият остатък е 4 – 4 = 0.

Нямаме нов остатък, затова на останалите две позиции поставяме нули. Двоичното число, което получаваме, е: 10 0110 1100:

26C-hex

Разделяме битовете на сегменти от по 4 бита, броено отдясно-наляво и по познатия начин събираме степените на двойката в отделните сегменти, за да получим компонентите на шестнадесетичното число: 26C.

Да вземем за пример едно по-голямо бинарно число, което да обърнем в шестнадесетичен и съответно в десетичен формат.

Пример: 1001 1101 1011 0001

Дописваме редицата битови позиции от осма нататък и сегментираме двоичното число на 4 групи от по 4 бита:

9DB1-hex

Според включените битове, изчисляваме десетичния еквивалент на числото:

32 768 + 4 096 + 2 048 + 1024 + 256 + 128 + 32 + 16 + 1 = 40 369

Шестнадесетичен еквивалент: 9DB1

Източници:

Advertisements

Вашият коментар

Попълнете полетата по-долу или кликнете върху икона, за да влезете:

WordPress.com лого

You are commenting using your WordPress.com account. Log Out / Промяна )

Twitter picture

You are commenting using your Twitter account. Log Out / Промяна )

Facebook photo

You are commenting using your Facebook account. Log Out / Промяна )

Google+ photo

You are commenting using your Google+ account. Log Out / Промяна )

Connecting to %s