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

от Уикипедия, свободната енциклопедия

Шестнайсетичната бройна система е позиционна бройна система, с основа 16, в която числата се представят с помощта на 16 динамични символа. Символите от 0 – 9 са представени чрез арабски цифри, а латинските букви A, B, C, D, E, F (или a – f) се ползват за стойностите от 10 до 15. Всяка шестнайсетична цифра се представя като група от четири двоични цифри (бит). Причина за това е, че за съхраняването на данните в оперативната памет на електронноизчислителни машини се използва двоичен код.

Представяне[редактиране | редактиране на кода]

Писмено представяне[редактиране | редактиране на кода]

Използване на 0-9 и A-F[редактиране | редактиране на кода]

0hex = 0dec = 0oct 0 0 0 0
1hex = 1dec = 1oct 0 0 0 1
2hex = 2dec = 2oct 0 0 1 0
3hex = 3dec = 3oct 0 0 1 1
4hex = 4dec = 4oct 0 1 0 0
5hex = 5dec = 5oct 0 1 0 1
6hex = 6dec = 6oct 0 1 1 0
7hex = 7dec = 7oct 0 1 1 1
8hex = 8dec = 10oct 1 0 0 0
9hex = 9dec = 11oct 1 0 0 1
Ahex = 10dec = 12oct 1 0 1 0
Bhex = 11dec = 13oct 1 0 1 1
Chex = 12dec = 14oct 1 1 0 0
Dhex = 13dec = 15oct 1 1 0 1
Ehex = 14dec = 16oct 1 1 1 0
Fhex = 15dec = 17oct 1 1 1 1

За да не се обърква представянето на символите в различните бройни системи се използват няколко установени практики. Една от тях е при изписването на знаците да се слага долен индекс, който показва основата на бройната система. Например 11910 в десетична и е равно на 7716 в шестнайсетична. Други предпочитат индекса да е текстов: 119decimal или 119d – десетична, 77hex или 77h – шестнайсетична. Изписването на отрицателни числа става по същият начин както и в десетична бройна система с „-“.

При разработката на софтуер се използват различни методи за представянето на шестнайсетичните символи:

  • В URIs (както и в URLs) низ от символи написан като шестнайсетична двойка се изписва с „%“: http://www.example.com/name%20with%20spaces, където %20 е празното място между знаците (стойности 2016 и 3210).
  • В XML и XHTML знаците могат да бъдат изразени с аритметични кодове като „&#xcode“, където „code“ e 1 – 6 цифрено шестнайсетично число добавено към символ от Unicode. Вследствие &#x007А е еквивалент на „z“(Уникод стойност 007А, десетична 122)
  • Цветовата гама в HTML, CSS и X Window System могат да бъдат изразени с шестцифрен шестнайсетичен код (по две за червено, зелено и синьо, съответно подредени в този ред), предхождан с #: бялото се възпроизвежда с #FFFFFF. В [CSS] това може да се представи и с 3 знака #FFF (бяло)
  • В програмните езици като C++, C#, Java, JavaScript, Python и Windows PowerShell се пише 0x пред шестнайсетичното число: 0xA12. Символи или символни низове могат да се представят с \x последвани от два шестнайсетични символа: \x1B.а
  • Други езици като Pascal, Delphi, някои версии на BASIC (Commodore), GML и Forth използват $ като префикс: $ 5A3.ac
  • В Unicode стандарт символна стойност се представя с "U +", следвана от шестнайсетична стойност: U +03B1 – гръцката буква алфа (α).
  • Всички IPv6 адреси могат да бъдат записани като осем групи от по четири шестнайсетични цифри, където всяка група е отделена от двоеточие (:). Валиден IPv6 адрес: 2001:0 db8: 85a3: 0000:0000:8 A2E: 0370:7334

Ранните писмени представяния[редактиране | редактиране на кода]

Изборът на буквите от А – F да заместят цифрите от 10 – 15 не е универсален в ранната история на компютрите.

  • Bendix G-15 компютри са използвали буквите U – Z вместо А – F.
  • The Librascope LGP-30 използва букви F, G, J, K, Q и W.

Ранно използване на шестнайсетичната бройна система в компютъра[редактиране | редактиране на кода]

Двоичната бройна система е много добра за компютрите, но има малък недостатък – броят на цифрите расте неимоверно бързо. Както се оказва, има и друга бройна схема, която също е благоприятна за компютрите: шестнайсетичната. Преди години, когато компютърът е бил все още съвсем ново откритие, хората, които го проектирали осъзнали, че трябва да се създаде стандарт за съхранение на информация. Тъй като компютрите могат да смятат само с двоични числа – букви, текст и други символи трябвало да бъдат съхранени като числа. Но притеснението им не е било само това. Те трябвало да се уверят, че числото, което представя примерно ‘А’, ще бъде едно и също на всички компютри. За да се улесни това се създала ASCII (от английски език – American Standard Code for Information Interchange) таблицата. В нея има невидими символи, които изпълняват определи функции, като отместване на указателя (09), звън (07). Могат да се използват различни комбинации на само осем двоични цифри, или битове, за да се представи всеки символ на ASCII графиката. 128 знака можели да изглеждат много, но не след дълго разработчиците забелязали липсата на много от специалните гласни, използвани от латинския език, различни от английския като например: ä, é, û и Æ. Също липсвали и математически символи (±, µ, °, ¼) и знаци за парични валути, различни от ($) като (£, ¥, ¢). За да се компенсира тази липса, ASCII таблицата била разширена от 128 на 256 символа.

Стойността на 256 може да бъде представена като (шестнайсет на квадрат), което ни връща към шестнайсетична бройна система. Оказва се, че всеки символ на ASCII таблицата може да се представи чрез двуцифрено число в шестнайсетична бройна система – от 00 до FF.

Преобразуване[редактиране | редактиране на кода]

Човек е свикнал да работи в десетична бройна система, но компютрите работят в двоична бройна система (съставена само от нули и единици). Целта на шестнайсетичната бройна система е да помогне на хората, когато работят с големи числа.

Decimal Binary Hex
0 0000 0
1 0001 1
2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
10 1010 A
11 1011 B
12 1100 C
13 1101 D
14 1110 E
15 1111 F

От двоична в шестнайсетична[редактиране | редактиране на кода]

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

0110 1000 1010 0010 1111

Гледайки горната таблица заместваме:

0110 = 6

1000 = 8

1010 = A

0010 = 2

1111 = F

Когато се съберат се получава, че 01101000101000101111(2) = 68A2F(16).

От шестнайсетична в двоична[редактиране | редактиране на кода]

Числото 68A2F(16) в двоична бройна система:

6 = 0110

8 = 1000

А = 1010

2 = 0010

F = 1111

Когато се съберат се получава, че = 68A2F(16) = 01101000101000101111(2).

От десетична в шестнайсетична[редактиране | редактиране на кода]

Имаме числото 428 591. Всяка цифра се разделя на 16 и се взима нейният остатък. Полученото от делението число делим отново на 16, дотогава докато се получи 0 за резултат. Получените от остатъка числа се вземат отзад напред (от последното деление до първото) и се получава числото в шестнайсетична бройна система.

428591 ÷ 16 = 26786 остатък 15
26786 ÷ 16 = 1674 остатък 2
1674 ÷ 16 = 104 остатък 10
104 ÷ 16 = 6 остатък 8
6 ÷ 16 = 0 остатък 6

Гледаме остатъка отзад напред и получаваме, че 428591(10) = 68A2F(16).

Това е C# имплементация на горния алгоритъм

static string baseToHex(int dec)
    {
        var sb = new StringBuilder();
        while(dec > 1)
        {
            var r = dec % 16;
            dec /= 16;
            sb.Insert(0, ((int)r).ToString("X"));
        }
        return sb.ToString();
    }

От шестнайсетична в десетична[редактиране | редактиране на кода]

Имаме числото 68A2F(16). Взимат се цифрите отзад напред, всяка се умножава с 16[0..n]. Резултатът се събира.

F * 160 = 15 * 1 = 15
2 * 161 = 2 * 16 = 32
A * 162 = 10 * 256 = 2560
8 * 163 = 8 * 4096 = 32768
6 * 164 = 6 * 65536 = 393216

15 + 32 + 2560 + 32768 + 393216 = 428591

И получаваме, че 68A2F(16) = 428591(10).

Това е C# имплементация на горния алгоритъм

static int hexToBase(string hex)
    {
        hex = hex.ToLower();
        int dec = 0;
        for(int i = hex.Length -1, power = 0; i >=0; i--, power++)
        {
            char c = hex[i];
            if (c >= 'a' && c <= 'z')
            {
                int temp = 0;
                switch (c)
                {
                    case 'a': temp = 10; break;
                    case 'b': temp = 11; break;
                    case 'c': temp = 12; break;
                    case 'd': temp = 13; break;
                    case 'e': temp = 14; break;
                    case 'f': temp = 15; break;
                }
                dec += temp * (int)Math.Pow(16, power);
            }
            else
            {
                dec += Convert.ToInt32(c.ToString()) * (int)Math.Pow(16, power);
            }
        }
        return dec;
    }

Инструменти за превръщане на бройни системи[редактиране | редактиране на кода]

Съвременните операционни системи с графичен интерфейс предлагат калкулатори, способни да преминават през различни бройни системи.

Във Microsoft Windows на калкулатора може да бъде зададен научен стил/програмистки стил, който предлага преобразуване от двоична, осмична, десетична и шестнайсетична бройни системи. За шестнайсетична бройна система има специални бутони от A до F, които стават активни, когато се избере бройната система (Hex). Но в шестнайсетичен стил калкулаторът може да смята само цели числа.

В Ubuntu, калкулаторът има научен изглед, който също поддържа пресмятането от различни бройни системи, което включва шестнайсетична. Също както във Microsoft Windows, има специални бутони от A до F.

В Mac OS X вграденият калкулатор не поддържа пресмятането на различни бройни системи.

Други варианти:

Може да се използва директно в търсачката като синтаксисът е следният:

При двоична → 0b111

Като 0b винаги стои пред числото, за което се търси.

При шестнайсетична → 0x23A1F

Като 0x винаги стои пред числото, за което се търси.

При осмична → 0o40

Като 0o винаги стои пред числото, за което се търси.

Съответно в зависимост от бройната система, в която искате да преобразувате, синтаксисът е: in decimal, in hex, in binary, in octal

Примери: 0b111 in decimal; 0x23A1F in decimal; 32 in binary; 32 in hex; 32 in octal; 0o40 in hex

Степени[редактиране | редактиране на кода]

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

2x стойност
20 1
21 2
22 4
23 8
24 10hex
25 20hex
26 40hex
27 80hex
28 100hex
29 200hex
2A(210dec) 400hex
2B(211dec) 800hex
2C(212dec) 1000hex
2D(213dec) 2000hex
2E(214dec) 4000hex
2F(215dec) 8000hex

Дори по-лесна за използване е степента на четворката, защото квадратът на четири прави шестнайсет – основата на шестнайсетичната бройна система. Примери за степени на четворката са показани по-долу:

4x стойност
40 1
41 4
42 10hex
43 40hex
44 100hex
45 400hex
46 1000hex
47 4000hex
48 10000hex

Култура[редактиране | редактиране на кода]

Етимология[редактиране | редактиране на кода]

Думата хексадесимал е съставена от хекса- (от гръцки език – „шест“) и -десимал (от латински език – „десет“). За първи път думата хексадесимал, заместваща ранната латинска интерпретация – сексадесимал, се появява през 1954 година. Думата шестдесетичен (за шейсетична бройна система) запазва латинското си название „сексагесимал“. Доналд Кнут е посочил, че правилният термин е „сенидъри“ (от английски – „senidery“) за латинското наименование – „групирани по 16“. Алфред Б. Тейлър е използвал „сенидъри“ в средата на 18 век в неговата документация за алтернативни бройни системи, въпреки че той отхвърля използването на шестнайсетична бройна система заради „неудобния брой цифри“. Шварцман отбелязва, че шестнайсетичната бройна система трябва да носи наименованието си от латински, а именно – „сексадесимал“. Но неговите опасения са, че компютърните хакери биха съкратили думата просто на „секс“. Етимологическото правилно гръцко понятие би било „хексадъкейдик“ (въпреки че в съвременния гръцки език е по-разпространено „дека-хексадик“).

Използване в китайската култура[редактиране | редактиране на кода]

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

Основни абревиатури[редактиране | редактиране на кода]

Цяло наименование на бройна система Абревиатура Основа
Двоична (на английски: binary) bin 2
Осмична (на английски: octal) oct 8
Десетична (на английски: decimal) dec 10
Шестнайсетична (на английски: hexadecimal) hex 16

Източници[редактиране | редактиране на кода]