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

от Уикипедия, свободната енциклопедия
Направо към: навигация, търсене

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

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

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

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

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“(Unicode стойност 007А, десетична 122)
  • Цветовата гама в HTML, CSS и X Windows могат да бъдат изразени с шест цифрен шестнадесетичен код (по две за червено, зелено и синьо, подредени в този ред) предхождан с #: бялото се възпроизвежда с #FFFFFF. В [CSS] това може да се представи и с 3 знака #FFF(бяло)
  • В програмни езици като C++, C#, Java, JavaScript, Python и Windows PowerShell се пише 0x пред шестнадесетичното число:0xA12. Символи или символни низове могат да се представят с \x последвани от два шестнадесетични символа:\x1B.а
  • Други езици като Pascal, Delphi, някои версии на BASIC ( Commodore ), GML и Forth използвате $ като префикс: $ 5A3.
  • В Unicode стандарт, символна стойност се представя с U + следвана от шестнадесетичен стойност: U +03B1 - гръцката буква алфа (α).
  • Всички IPv6 адреси могат да бъдат записани като осем групи от по четири шестнадесетични цифри, където всяка група е отделена от двоеточие ( : ).Валиден IPv6 адрес: 2001:0 db8: 85a3: 0000:0000:8 A2E: 0370:7334

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

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

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

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

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

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

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

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

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

От Двоична в Шестнадесетична[редактиране | edit source]

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

0110 1000 1010 0010 1111

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

0110 = 6

1000 = 8

1010 = А

0010 = 2

1111 = F

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

От Шестнадесетична в Двоична[редактиране | edit source]

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

6 = 0110

8 = 1000

А = 1010

2 = 0010

F = 1111

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

От Десетична в Шестнадесетична[редактиране | edit source]

Имаме числото 428591. Всяка цифра се разделя на 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();
    }

От Шестнадесетична в Десетична[редактиране | edit source]

Имаме числото 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;
    }

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

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

Във 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

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

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

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

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

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

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

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

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

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

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

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