Какво е Hex?

Ще трябва да науча малко от това.

Има сцена в началото на Марсиан (2015), в която героят на Мат Деймън Марк Уотни, предположил мъртъв от своите съотборници и заседнал на червената планета след прищяла буря, реанимира разрушилата се сонда Pathfinder, за да общува с НАСА. Докато сондата е в състояние да изпраща изображения обратно на Земята, най-доброто НАСА може да направи дистанционно със сондата е да промени позицията на своята бордова камера.

Уотни осъзнава, че 360-градусовото въртене на камерата би позволило на екипа на НАСА да изписва съобщения до него писмо по буква, ако той може да им предостави азбука, която да насочва камерата на сондата. Това решение обаче представлява друг проблем. Латинската азбука има 26 знака на английски език, което означава, че те ще трябва да са доста близо един до друг в кръг около сондата и е много вероятно той да изпитва затруднения да разпознае коя буква е сочена.

„Това не може да бъде нашата азбука. 26 знака плюс карта за въпроси на 360 ни дава 13 градуса дъга. Това е твърде тясно Никога не знаех какво сочи камерата ... Шестнадесетици за помощ. "

Така че вместо това Уотни решава проблема, като използва шестнадесетици и ASCII таблица, за да дешифрира кодирани съобщения от НАСА, и преди да го знаете, той може да говори с Земята в повече от просто да / не въпроси.

Рол кредити

…чакаме какво?

Знаеш, че правиш сложна математика, когато започнеш да използваш букви.

Ще призная, че едвам разбирам какво се е случило в тази сцена първия път, когато видях филма. Във филм с някои доста напреднали научни концепции тази сцена ми се стори, защото ми се стори доста проста идея, която въпреки всичко ми мина над главата. Очевидно режисьорът Ридли Скот е имал затруднения в изобразяването на тази сцена, тъй като сам не е разбрал напълно концепцията.

В момента уча програмиране и разбрах, че дори и езици от по-високо ниво като Ruby или Javascript да бъдат трудни за овладяване, те все още са доста далеч от основния машинен код, който захранва компютрите, базирани чисто на 1 и 0 , Това ниско ниво на програмиране винаги ме е плашело и вероятно е била основната причина да имам малък интерес към компютърните науки като кариерно поле преди половин живот, преди програмирането да стане по-достъпна професия. Но откакто започнах по пътя към това да бъда програмист преди 6 седмици, научих, че можете да разбиете всяко сложно действие / концепция до управляем размер, ако просто преминете през него парче по парче.

Нека започнем с думата шестнадесетична. Той е получен от гръцкия шестнадесетичен смисъл 6 и десетичен, който е изведен от латинския децимус, означаващ десети. Хексадецималите са числова система, която използва 16 като своя основа, вместо 10, както е в случая с „нормалните“ десетични знаци.

Сега, ако трябваше да обясните базова система с числа 10 на някой, който никога не е правил аритметика преди това, първо трябва да обясните защо е изгодно да използвате дори цифрова система на първо място. В крайна сметка, можем също толкова лесно да използваме обикновена наклонена черта („\“), за да посочим количеството обекти. Например, една риба може да бъде представена като \ риба, две риби като \\ риба, три риби като \\\ риба и т.н. На теория бихте могли да представите всяко количество риба, използвайки само един знак. На практика обаче това става неуправляемо, след като попаднете на големи количества риба. Дори петдесет риби се превръщат в нечетливо дълги резки.

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ риба
Рибите нямат краткосрочната памет, за да представят толкова много, както и вие.

Използвайки десетична система base10, много лесно можем да представим количество риба 1000 пъти по-голямо от горните наклонени черти, използвайки една десета от броя на \. Ще трябва да използваме още няколко символа от един прост наклон, но компромисът в ефективността си заслужава. Всъщност той е толкова ефективен, че ни е необходима само комбинация от два от тези символи, за да представим тези 50 риби по-горе.

Цифрите в системата base10 са:

0 1 2 3 4 5 6 7 8 9

където

0 =
1 = \
2 = \\
3 = \\\
4 = \\\\
5 = \\\\\
6 = \\\\\ \
7 = \\\\\ \\
8 = \\\\\ \\\
9 = \\\\\ \\\\

Така че \\\\ рибата може да бъде написана като 4 риби вместо това, заемайки част от пространството. След като достигнем количество, по-голямо от 9, трябва да започнем отначало с 1 и да добавим цифра на заместител, 0.

10 = \\\\\ \\\\\

Сега, за да представим количество по-голямо от 10, например 4 по-голямо от 10, просто комбинираме цифрите 10 и 4, за да направим 14

10 = \\\\\ \\\\\
4 = \\\\
14 = \\\\\ \\\\\ \\\\

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

...
17
18
19
20
21
...

Можем да следваме този модел до 99, при което можем да започнем шаблона отново с 10 и допълнително 0: 100. Така че в десетична система на базата на 10 всеки допълнителен 0 добавен вдясно прави числото 10 пъти по-голямо от предходния.

10 * 1 = 10
10 * 10 = 100
10 * 100 = 1000
10 * 1000 = 10000
...

Така че защо base16?

Очевидно система, която използва десет цифри, има много смисъл, ако сте използвали един през целия си живот, и е много интуитивно, като се има предвид, че всички сме родени с два набора от пет пръста, на които да разчитате (думата цифра на латински означава "пръст", в края на краищата), и така сме свикнали да разглеждаме кратни по десет в групи от по пет.

Що се отнася до данните, съхранявани на компютрите, кратните 5 не са почти толкова полезни. По принцип компютърна верига може да съществува в едно от двете състояния: изключено или включено и затова целият компютърен код е основно бинарен (лат. Binarius „състоящ се от две“). Най-малкото групиране на данни в бинарна система е бит (двоична цифра), които могат да бъдат организирани в група от 8, наречена байт. Тъй като един бит може да има две възможни стойности (0 или 1), един байт може да съхранява 16 възможни състояния.

0 или 1 (2)
0 или 1 (4)
0 или 1 (6)
0 или 1 (8)
0 или 1 (10)
0 или 1 (12)
0 или 1 (14)
0 или 1 (16)

С всеки от тези 8 бита, имащи 2 възможни състояния, има общо 256 (2⁸) възможни комбинации, които могат да се съхранят в един байт.

https://cs.stackexchange.com/questions/19568/how-can-one-byte-hold-256-possibilities

Ако щракнете тези 256 възможни стойности в десетична система, ще ви трябват три цифри.

Двоична десетична
00000000 000
00000001 001
00000010 002
00000011 003
....
01100011 009
....
11111111 255

Така че е възможно, но както при примера за броене на риба с наклонена черта, това не е най-ефективната система, ако основната ни единица е един байт. Използвайки десетична система base16, можем да представим всяка възможна битова комбинация от един байт, използвайки само две шестнадесетични цифри. Ще трябва да използваме още няколко символа, отколкото в десетичната система, но за целите на ефективността и мащабируемостта и четивността на човека си заслужава.

Шестнадесетичните цифри са:

0 1 2 3 4 5 6 7 8 9 A B C D E F

където

Дек Хекс
 0 = 0
 1 = 1
 2 = 2
 3 = 3
 4 = 4
 5 = 5
 6 = 6
 7 = 7
 8 = 8
 9 = 9
10 = A
11 = В
12 = С
13 = D
14 = Е
15 = F

Така че 10 в десетичен знак може да се запише като A в шестнадесетичен, спестявайки цифра. След като достигнем количество, по-голямо от шестнадесетичен F (dec 15), трябва да започнем отначало с 1 и цифра на заместителя, 0.

Дек Хекс
16 = 10

Сега, за да представим количество, по-голямо от 16, например 4 по-голямо от 16 (20 в десетична), ние просто комбинираме шестнадесетичните цифри 10 и 4, за да направим шестнадесетичен 14.

Дек Хекс
16 = 10
 4 = 4
Дек Хекс
20 = 14

След като достигнем шестнадесетичен 1F (31 в десетична), просто повтаряме и увеличаваме първата цифра с една.

Дек Хекс
...
 28 = 1D
 29 = 1Е
 31 = 1F
 32 = 20
 33 = 21
 34 = 22
...

Можем да следваме този модел до шестнадесетичен FF, при който можем да започнем шаблона отново с 10 и допълнителен 0: шестнадесетичен 100 (256 в десетичен знак). Всеки допълнителен 0 добавен вдясно прави числото 16 пъти по-голямо от предходното.

Шестнадесети дек
10 * 1 = 10 16 * 1 = 16
10 * 10 = 100 16 * 16 = 256
10 * 100 = 1000 16 * 256 = 4096
10 * 1000 = 10000 16 * 4096 = 65536
10 * 1000 + 1 = 10001 16 * 4096 + 1 = 65536
...

#bringhimhome

И така на Марс - използвайки шестнадесетици вместо буквите на азбуката, героят на Мат Деймън е в състояние да намали броя на възможните цифри, които може да получи от Земята с 10, и по-лесно да разпознае позицията на камерата.

Тази диаграма включва и осмици.

Кодът, който НАСА предава, се извлича от ASCII таблица (вляво), в която всяка шестнадесетична стойност (в червено) между 0 и 7F (0–127 в десетична) се преобразува в един знак. За да декодира съобщението, всичко, което Watney трябва да направи, е да съответства на шестнадесетичните стойности на буквите от азбуката в таблицата.

48 4F 57 41 4C 49 56 45
H O W A L I V E

Което по същество е всичко, което компютърът прави, когато чете и извежда данни.

Като допълнителен бонус, с цялото пространство, предоставено от само 7 бита, таблицата ASCII включва и пунктуация (!), Така че НАСА е в състояние да предава редове от код, които позволяват на Уотни да свърже предавателя на Pathfinder към по-мощния комуникационен софтуер на марсохода Rover , Шестнадесетични за спасяване.

Оригиналната таблица на ASCII (Американски стандартен код за обмен на информация) е разработена в САЩ през 60-те години на миналия век и първоначално се изискваше само 7 бита за съхраняване. Повечето съвременни кодировки на текст използват 8 бита, но се базират на оригиналната рамка и системата продължава да се използва и до днес. Дори и да не сте програмист, несъмнено сте виждали шестнадесетици, използвани във вашия уеб браузър, в URL адрес като: http://www.example.com/this%20is%20an%20example

където% 20 (шестнадесетичен 20) се преобразува в символа [интервал] в ASCII диаграмата, тъй като URL адресите не могат да приемат празни интервали и други знаци.

Друго място, където преди сте виждали шестнадесетици, е когато избирате цветове във всеки софтуер, който позволява персонализиране на цветовете на RGB стойности.

Добрите дни.

RGB означава основните цветове: червен, син и зелен. В първите дни на изчислението три бита (0 или 1) могат да съхранят стойността на една от 8 (3²) възможни цветови комбинации, където 000 създава черно (без цвят), 111 ви дава бяло (всички цветове комбинирани) и други шест цвята са резултат от комбинациите между тях.

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

Чрез увеличаване на битовата дълбочина до 8 байта (24-битови), всяка R, G или B стойност на цвета може да съхранява 256 възможни нива в един байт, което позволява 16,777,216 (2 ²) възможни цветове. Това добавя до осем безсмислени цифри в десетичен знак10, но всяка една от тези шестнадесет плюс милиона цветови комбинации може да бъде описана в четим от човека формат, като се използват само 3 двойки шестнадесетични цифри:
Черен = # 00000
Червен = # FF0000
Синьо = # 00FF00
Зелено = # 0000FF
Бяло = #FFFFFF

Обичайно е числото да се съкращава, когато две цифри се повтарят, така че шестнадесетичната стойност за тъмно жълто # FFCC00 също може да бъде записана като # FC0.

За сравнение това е 16 763 904 в десетичен знак10.

Дано този пост е демистифицирал шестнадесетици за вас; Знам, че по-нататъшното проучване на тази тема направи компютърните науки да изглеждат много по-малко завладяващи за мен, всички вдъхновени от победителя през 2015 г. за най-добра комедия и / или мюзикъл.