Co to jest system szesnastkowy?

13

Co to jest system szesnastkowy i dlaczego jest tak często wykorzystywany w komputerach? Wiem, że komputery używają zer i jedynek do przechowywania danych, więc dlaczego używamy wartości szesnastkowej?

Justin Krejcha
źródło
13
Jeśli nie jest to poza tematem, to dlaczego takie podstawowe pytanie nie jest duplikatem 5 lat po rozpoczęciu Super użytkownika?
Peter Mortensen
3
@PeterMortensen Nawet dziwniejsze, nawet nie został jeszcze zapytany na żadnej ze stron siostrzanych, przynajmniej nie mogę tego znaleźć.
Nzall
9
Być może nie trzeba o to pytać, ponieważ Wikipedia ma całkiem dobrą odpowiedź: en.wikipedia.org/wiki/Hexadecimal
Piers Myers
4
Dlaczego tyle głosów poparcia?
Vi.

Odpowiedzi:

31

Szesnastkowy to system liczbowy, który jest bardzo powszechny w obliczeniach. Być może słyszałeś już o binarnym , który ma tylko 1 i 0.

Ludzie używają głównie systemu dziesiętnego (podstawa 10), w którym mamy 10 cyfr:

0, 1, 2, 3, 4, 5, 6, 7, 8 i 9

Chociaż komputery nie działają w systemie dziesiętnym. Mają stan binarny (coś jest prawdą lub fałszem) i dlatego działa w bazie 2 (liczby binarne są zwykle poprzedzone 0b), a jedynymi cyframi są 0 i 1.

Wcześniej używano ósemki (lub podstawy 8). Było dobrze, ponieważ „10” w bazie 8 to „0b1000” w systemie binarnym (10 w systemie dziesiętnym to 1010 w systemie binarnym). Podczas zapisywania liczb ósemka zwykle ma przedrostek „0o” (ale w większości języków programowania ma przedrostek „0”). Nazywa się to base 8, ponieważ mamy osiem cyfr.

Oktal jest nadal używany, głównie przy ustawianiu uprawnień w systemach Unix i Linux

Z biegiem czasu potrzebowaliśmy łatwiejszego sposobu przedstawiania większej liczby, ponieważ moc obliczeniowa i przestrzeń szybko rosły. Stało się standardem używania szesnastkowego lub podstawowego 16, ponieważ 16, podobnie jak 8, jest potęgą 2, co ułatwia konwersję cyfr po cyfrze (patrz ten komentarz . Ponieważ jest 16 cyfr, dla których użyto liter inne cyfry. Ponadto, hex jest zwykle poprzedzony 0x.

Liczby szesnastkowe są również przydatne, ponieważ liczba szesnastkowa to 4 bity (1 liczba ósemkowa może reprezentować 2), a zatem dwie liczby w bajcie. W większości edytorów szesnastkowych tak jest reprezentowany bajt.

Rachunkowość

W bazie 10 mamy 10 cyfr. Po 9, co robimy? Brakuje nam cyfr. Tworzymy miejsce „dziesiątki” po lewej stronie oryginalnej liczby, mają one wartość 1, a skrajna prawa staje się 0. To samo dzieje się również w systemie szesnastkowym:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11 itp.

Dopóki nie dojdziemy do 0x1F, a następnie proces powtarza się do 0xFF (255 w systemie dziesiętnym), a następnie otrzymujemy 0x100. Więcej informacji na temat liczenia można znaleźć tutaj .

Oto wykres przedstawiający konwersje między liczbami dziesiętnymi, szesnastkowymi, ósemkowymi i binarnymi: Szesnastkowy wykres konwersji

Justin Krejcha
źródło
21
Główną zaletą jest to, że ponieważ 16 to potęga 2, możesz wykonywać konwersje cyfra po cyfrze.
TRiG
2
Zauważ, że wiele języków używa 0przedrostka, a nie 0oliczb ósemkowych.
ysap
2
Twoja notatka o 16 będącym wielokrotnością 2 została niepoprawnie skopiowana z komentarza TRiG. Bycie wielokrotnością nie jest istotną relacją.
Ryan Reich,
2
@ justcool393, warto wspomnieć, że nazwa tak zwanej „podstawy 10” jest w rzeczywistości „dziesiętna”. Może to pomóc wyjaśnić związek między zasadą 8 (ósemkową), zasadą 10 (dziesiętną) i zasadą 16 (szesnastkową).
HalosGhost,
3
Arrrg. Każda baza to baza 10! stale.soup.io/post/114652207/every-base-is-base-10
woliveirajr
4

Co to jest system szesnastkowy

System szesnastkowy jest systemem numeracji bazowej 16, który używa 16 cyfr ( 0123456789ABCDEF), w przeciwieństwie do binarnego, który używa 2 ( 01) lub dziesiętnego, który używa 10 (0-9). Ponieważ w naszym systemie jest tylko 10 cyfr (w naszym systemie), litery od A do F służą zamiast tego do opisania „cyfry 10”, „cyfry 11” itd.

dlaczego jest tak często wykorzystywany w informatyce

16 to potęga 2, która ułatwia konwersję liczb szesnastkowych na liczby binarne i, jak zauważyłeś, „komputery używają zer i jedynek do przechowywania danych”. Ponieważ każda cyfra przechowuje dokładnie 4 bity danych, cyfrę szesnastkową można bardzo łatwo przekonwertować na 4 cyfry binarne (1 bit) i odwrotnie.

| hex bin  | hex bin  |
| 0   0000 | 8   1000 |
| 1   0001 | 9   1001 |
| 2   0010 | A   1010 |
| 3   0011 | B   1011 |
| 4   0100 | C   1100 |
| 5   0101 | D   1101 |
| 6   0110 | E   1110 |
| 7   0111 | F   1111 |

dlaczego używamy szesnastkowego

Reprezentowanie dużych liczb jest łatwiejsze niż binarne. Tylko dwie cyfry szesnastkowe mogą reprezentować 256 różnych wartości, jak w:

dec  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ...
hex 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 ...

Cztery cyfry szesnastkowe mogą reprezentować 65536 wartości i tak dalej. Hex znacznie ułatwia inspekcję danych za pomocą zrzutu heksadecymalnego , ponieważ litery, cyfry i znaki interpunkcyjne są przechowywane w formacie, który odwzorowuje każdy znak na liczbę od 0 do 256 (nazywaną ASCII lub czasami przy użyciu innych kodowań). Ponadto wiele innych formatów plików (takich jak PNG) jest dostosowywanych tak, aby każda informacja, z której składa się plik, zawiera 256 bitów.

Podsumowując, 16 to potęga 2, a 256 to potęga 16. To dobry sposób na przedstawienie zarówno liczb binarnych, jak i tekstu lub innych danych.

Klamka
źródło
2

Co to jest system szesnastkowy?

Jeśli masz liczbę abcd, oznacza to, że ((a * + b) + c) + d. To jest jak:

  • abcd (binarny) = ((a * 2 + b) * 2 + c) * 2 + d
  • abcd (ósemkowy) = ((a * 8 + b) * 8 + c) * 8 + d
  • abcd (dziesiętny) = ((a * 10 + b) * 10 + c) * 10 + d
  • abcd (szesnastkowy) = ((a * 16 + b) * 16 + c) * 16 + d

W systemie szesnastkowym potrzebujesz 16 cyfr, ale mamy tylko dziesięć cyfr (0..9). Zatem dla brakujących 6 cyfr używane są znaki A..F z A = 10, ..., F = 15.

Oczywiście możesz również pomyśleć o wielu innych systemach liczbowych, na przykład o podstawie 5 lub 7.

Do obliczeń z liczbami nie ma znaczenia, jakiej bazy używasz. Możesz dodawać i mnożyć w systemie binarnym, możesz to robić w systemie dziesiętnym i możesz to robić w systemie szesnastkowym. Jesteśmy przyzwyczajeni do obliczania w systemie dziesiętnym, komputery robią to w systemie binarnym.

Dlaczego system szesnastkowy jest tak często wykorzystywany w informatyce?

Jak wspomniano powyżej, nie ma znaczenia, w którym systemie liczbowym podajesz numer. Podstawowa liczba jest taka sama, zmienia się tylko reprezentacja. Komputer zawsze wewnętrznie przechowuje i używa (np. Oblicza z) liczb w formacie binarnym.

Dlaczego więc programiści (jak ja) używają różnych systemów liczbowych? Istnieją dwa powody, aby wybrać system liczbowy oparty na potędze 2. Pierwszy to krótkość, a drugi to dobry widok, które bity są ustawione.

Krótkość

Jeśli mam funkcję, która zapisuje zawartość bufora na konsoli, mógłbym napisać kod drukowany w systemie dziesiętnym, który składa się z 1 do 3 cyfr (dziesiętnie: 0..255). Jeśli piszę liczbę w formacie binarnym, otrzymam od 1 do 8 cyfr (binarnie: 0..11111111). Mógłbym również użyć systemu ósemkowego i skończyć z 1 do 3 cyfr (ósemkowy: 0..377) lub szesnastkowy z 1 do 2 cyfr (szesnastkowy: 0..ff).

To był tylko jeden bajt. Załóżmy teraz, że chcesz zapisać liczbę 32-bitową:

  • binarny: 0..11111111111111111111111111111111
  • ósemkowy: 0..37777777777
  • dziesiętny: 4294967295
  • szesnastkowy: 0..ffffffff

Jak widać, dane szesnastkowe są najkrótsze.

Widzę bity

Częstym wzorem przechowywania informacji w pakiecie jest użycie każdego bitu w bajcie osobno. Weźmy na przykład atrybuty pliku (patrz MDSN ). Chcesz atrybuty „ukryte”, „archiwum”, „tylko do odczytu”, „tymczasowe” i inne. Możesz przechowywać każdy atrybut w jednym bajcie lub możesz spakować informacje do jednego bajtu (lub wielu bajtów), gdzie każdy bit reprezentuje dokładnie jeden atrybut. Jeśli spojrzysz na dwFlagsAndAttributes w artykule MSDN, zobaczysz, że Windows używa tego wzorca.

Pozostając na stronie MSDN, weźmy FILE_ATTRIBUTE_ENCRYPTEDjako przykład, ta flaga ma wartość dziesiętną 16384 i szesnastkową 0x4000. Wiodące „0x” to tylko konwencja programisty C do oznaczania liczb szesnastkowych, więc popatrzymy na 4000. Kiedy chcesz wiedzieć, które bity są ustawione, najpierw musisz przekonwertować 16384 na binarne - nic, czego nie możesz zwykle robi to z arytmetyką mentalną. Ale weźmy szesnastkowy 4000. To całkiem proste. 16 to 2 * 4, więc każda liczba szesnastkowa to dokładnie 4 bity. Dlatego właśnie konwertujemy 4 na binarne 0100 i zera na binarne 0000 i gotowe.

Często nie chodzi o poszczególne bity, ale programiści mają tendencję do dopasowywania rzeczy do potęg 2. Liczymy, że programy ładujemy nie na losowy adres, ale na adres z 16 najmniej znaczącymi bitami ustawionymi na zero. W ten sposób, jeśli masz adres 0x12345678, możesz łatwo zobaczyć, że ten adres należy do programu załadowanego do 0x1234, a nie do tego załadowanego do 0x03810000.

Wolisz binarny, ósemkowy czy szesnastkowy?

To kwestia smaku. Jeśli chcesz bezpośrednio zobaczyć bity, binarne może być w porządku. W przypadku długich liczb binarny może być frustrujący, jeśli trzeba policzyć cyfry, aby sprawdzić, czy ustawiony jest bit 23 lub bit 24. Jest to łatwiejsze w systemie szesnastkowym, ponieważ każda cyfra reprezentuje 4 bity, więc masz mniej liczenia. Osobiście rzadko używam ósemki. To jest bardzo rzadkie.

Ale dlaczego nie użyć bazy 32?

Baza 32 to potęga 2, to świetnie. Ale potrzebujesz 32 cyfr, takich jak 0..9, A..V. Jest to o wiele więcej cyfr do zapamiętania (czy możesz łatwo zauważyć, na którą liczbę „S” zareaguje?). Kolejnym zastrzeżeniem jest to, że z bazą 32 tracisz fajną cechę, że dwie cyfry szesnastkowe są dokładnie jednym bajtem, co jest bardzo przydatne, jeśli spojrzysz na zawartość pamięci! Również w przypadku bazy 32 nadal potrzebujesz 2 cyfr do reprezentowania wartości, które może mieć jeden bajt. W przypadku wartości 32-bitowej potrzebujesz tylko 7 cyfr zamiast 8 cyfr szesnastkowych, ale to nie tyle żyć z wadami podstawowego systemu 32.

Werner Henze
źródło
1

Różne stosowane obecnie systemy reprezentacji liczb (= obejmują):
binarne, ósemkowe, dziesiętne i szesnastkowe.
Wybór jednego z nich zależy często od łatwości użycia do danego zadania.

binarny jest używany w systemach komputerowych i ogólnie technologii cyfrowej, ponieważ łatwo jest reprezentować w elektronice; funkcje liczb bazowych 2 są łatwe do zbudowania, podobnie jak reprezentacja on / off, true / false lub innych podobnych powtarzających się informacji dwustanowych.

octal miło jest mieć, jeśli istnieją grupy trzech cyfr binarnych, np. jak w ustawieniach uprawnień w systemach Unix / Linux.

pomijam na chwilę dziesiętną, szesnastkowa jest ładna w taki sam sposób jak ósemkowa, ale dla czterech cyfr binarnych, a fakt, że 8 bitów, jeden bajt, ładnie pasuje do dwóch cyfr szesnastkowych. ( = odpowiedź )
Z tego wynika, że ​​nawet 8-bitowe grupy w komputerze można łatwo zapisać, przedstawić i zrozumieć - to znaczy; bardzo wygodny w codziennym użytkowaniu podczas pisania oprogramowania, obsługi danych (np. wartości kolorów rgb w HTML / CSS), tworzenia struktur danych i wszystkiego podobnego.

dziesiętny . Można się domyślić, że system dziesiętny rozwinął się z faktu, że mamy dziesięć palców u rąk i nóg. Pojedyncza cyfra oznacza liczbę zliczonych elementów, po jednym na każdy palec do maksymalnie dziesięciu.

Reprezentują one systemy liczbowe o podstawie:
2, 8, 10 i 16.

Ogólnie rzecz biorąc, podstawa mówi, ile jednocyfrowych „elementów” można policzyć, np. Dwójkowy ma dwa, dziesiętny ma dziesięć.
Ponieważ liczba szesnastkowa zawiera 16 pozycji jednocyfrowych, system wymaga 16 „cyfr”, dlatego używa 0-9 i af (6 dodatkowych, w porównaniu do dziesiętnych), gdzie „a” równa się 10, a „f” równa się 15 w systemie dziesiętnym.

Aby kontynuować w trybie ogólnym: każda podstawowa 2 lub wyższa działa tak samo jak cokolwiek innego, o ile masz ładną reprezentację jednocyfrową.

Liczby dziesiętne tworzą:

... d * 10³ + c * 10² + b * 10¹ + a * 10⁰

dla liczby dziesiętnej „dcba” - d, c, b, a, wybrany z 0123456789

Teraz zmień to na:

... d * base³ + c * base² + b * base¹ + a * base⁰

i masz bardziej ogólną formę, która pokazuje, jak działa jakakolwiek podstawa 2 lub wyższa;
np. pięciocyfrowa podstawa 5 może być tak samo wygodna jak dowolna z pozostałych powyżej, lub dlaczego nie 12-cyfrowy (jeden tuzin) system czasu (12 godzin = „10” podstawa 12, z pierwszym „dziesiętnym” informującym, który 1/12 [5 minut] godziny)

Uwaga: ⁰¹²³ - indeks górny 0123, jeśli ekran pokazuje coś innego

Hannu
źródło
Obecnie może to być „skrót” tego, czym może się stać.
Hannu