2014-09-03 11 views
6

Czytałem wyjaśnienieDlaczego czasami używamy formatu szesnastkowego po przecinku?

int a = 0x1; //hexadecimal format 

ale nadal nie mogę znaleźć powód dlaczego programista powinien używać 0x1, 0x2 zamiast zwykłego całkowitą 1 lub 2 ...

Czy ktoś wyjaśnij to?

Dziękuję.

+0

Liczby mogą bardziej logicznie rozumieć (np. "0x0001, 0x0010, 0x0100, 0x1000" zamiast "1, 16, 256, 4096"). Jest również bardzo często stosowany w kolorach i kodach błędów. – Obicere

+0

Wierzę, że jest to duplikat pytania, na które odpowiedziałem, [tutaj] (http://stackoverflow.com/questions/18304564/what-does-this-line-of-code-do-const-uint32-t -goodguys-0x1-0/18317401 # 18317401). – Jashaszun

+0

@Jashaszun Podczas gdy materiał pytania jest powiązany, uważam, że to pytanie dotyczy szerokiego zastosowania formatu szesnastkowego, podczas gdy pytanie, które łączysz, jest bardziej skoncentrowane na jednym konkretnym przypadku. Nadal uważam, że twoja odpowiedź zawiera świetne punkty związane z tym pytaniem. – Vulcan

Odpowiedz

2

Nie ma żadnej różnicy. Myślę, że jest to oparte na rozważaniu zgodności. Na przykład, chcesz określić niektóre kolory, takie jak 0xffffff, 0xab32, 0x13 i 0x1, które są spójne i łatwe do odczytania.

+0

Kolory są znacznie lepiej reprezentowane w systemie szesnastkowym niż dziesiętnym, +1. – Vulcan

4

Jednym z powodów, dla których sam się wykorzystałem, jest to, że pomaga on organizacyjnie/wizualnie (to znaczy ludziom, gdy układa je w kod), jeśli chodzi o flagi.

tj

int a = 0x1; 
int b = 0x2; 
int c = 0x4; 
int d = 0x8; 
int e = 0x10; 

i tak dalej. Te mogą być następnie bitowo połączone ze sobą bardziej zgrabnie.

Na przykład wszystkie powyższe bitwise-OR'ed to: 0X1F, czyli 11111 w binarnych lub oddzielnych polach binarnych.

Następnie, jeśli chcę usunąć flagę I bitowe- XOR to.

tj

0x1F XOR 0x8 = 10111

+0

Wierzę, że masz na myśli 0x10 dla 0x16 ??? I 0x16 XOR 0x8 nie usuwa żadnych bitów, ponieważ nie mają wspólnych bitów. – user949300

+0

@ user949300: Tak, dziękuję. – khampson

4

Istnieje szereg powodów, niektóre osoby wolą reprezentację szesnastkową na jednym miejscem po przecinku. Najbardziej powszechne w obliczeniach są: bit fields. Kilka osób już wspomniane kody kolorów, np:

red = 0xFF0000 // 16711680 in decimal 
green = 0x00FF00 // 65280 in decimal 
blue = 0x0000FF // 255 in decimal 

Należy pamiętać, że ta reprezentacja koloru jest nie tylko bardziej intuicyjne niż próbuje dowiedzieć się, jaki kolor może być losową liczbę całkowitą jak 213545, ale także zajmuje mniej miejsca niż 3-tka podobna do (125, 255, 0) reprezentująca (R,G,B). Reprezentacja heksadecymalna jest łatwym sposobem na streszczenie tego samego pomysłu, co 3-krotna z dużo mniejszym obciążeniem.

Należy pamiętać, że ugryzł pola mają wiele zastosowań, pod pola spacetime bitowe:

Represents x coordinate 
    | Represents y coordinate 
    | | Represents z coordinate 
    | | | Represents t 
    | | | | 
    1A 2B 3C 4D 

Innym powodem, dlaczego ktoś może użyć wartości hex jest bo to czasami łatwiejsze do zapamiętania (i stanowią) binarną cyfrę jako dwa symbole zamiast trzech. Rozważmy x86 Instruction Reference. Wiem z góry, że 0xC3 jest ; Łatwiej jest zapamiętać numery heksadecymalne 00-FF niż dziesiętne 0-255 (Sprawdziłem i ret kończy się na 195), ale twój przebieg może się różnić. Na przykład, jest to jakiś kod from a project Pracuję na:

public class x64OpcodeMapping { 
    public static final Object[][] map = new Object[][] { 
      { "ret", 0xC3 }, 
      { "iret", 0xCF }, 
      { "iretd", 0xCF }, 
      { "iretq", 0xCF }, 
      { "nop" , 0x90 }, 
      { "inc" , 0xFF }, 
    }; 
} 

Istnieją wyraźne korzyści (nie wspominając o konsystencji) przy użyciu notacji szesnastkowej tutaj. Wreszcie, jak wspomina Obicere, kody szesnastkowe są często używane jako kody błędów.Czasami są zgrupowane w nieco podobny do pola sposób. Na przykład:

0x0X = fatal errors 
0x1X = user errors 
0x2X = transaction errors 
// ... 
// X is a wildcard 

ramach takiego schematu, minimalna lista błędów będzie wyglądać następująco:

0x00 = reserved 
0x01 = hash mismatch 
0x02 = broken pipe 
0x10 = user not found 
0x11 = user password invalid 
0x20 = payment method invalid 
// ... 

pamiętać, że ta pozwala również na dodawanie nowych błędów pod 0x0X jeśli taka potrzeba będzie wynikać. Ta odpowiedź okazała się o wiele dłuższa, niż się spodziewałem, ale mam nadzieję, że rzucę trochę światła.

Powiązane problemy