2014-09-03 13 views
6

Ho letto la spiegazione suPerché a volte utilizziamo il formato esadecimale su decimale?

int a = 0x1; //hexadecimal format 

Ma ancora, non riesco a trovare il motivo per cui un programmatore dovrebbe usare 0x1, 0x2 anziché intero semplice 1 o 2 ...

Can qualcuno per favore spiega questo?

Grazie.

+0

I numeri possono essere più logici in questo modo (ad esempio '0x0001, 0x0010, 0x0100, 0x1000' invece di' 1, 16, 256, 4096'). È anche molto comunemente usato nei colori e nei codici di errore. – Obicere

+0

Credo che questo sia un duplicato di una domanda a cui ho risposto, [qui] (http://stackoverflow.com/questions/18304564/what-does-this-line-of-code-do-const-uint32-t -goodguys-0x1-0/18.317.401 # 18.317.401). – Jashaszun

+0

@Jashaszun Mentre il materiale delle domande è correlato, ritengo che questa domanda riguardi l'ampio uso del formato esadecimale mentre la domanda che si collega è più focalizzata su un caso specifico. Tuttavia, credo che la tua risposta là faccia grandi punti relativi a questa domanda. – Vulcan

risposta

2

Nessuna differenza in realtà. Penso che sia basato sulla considerazione della coerenza. Ad esempio, si desidera specificare alcuni colori, come 0xffffff, 0xab32, 0x13 e 0x1, che sono coerenti e facili da leggere.

+0

I colori sono di gran lunga meglio rappresentati in esagono che decimali, +1. – Vulcan

4

Una delle ragioni per cui mi sono abituato è che aiuta organizzativamente/visivamente (cioè per gli umani quando li posiziona nel codice) quando si tratta di bandiere.

cioè

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

e così via. Quelli possono quindi essere raggruppati in modo più preciso.

Ad esempio, tutti i token di bit bit-OR sopra indicati sono 0X1F, che è 11111 in binari o campi binari separati.

Quindi, se desidero rimuovere una bandiera, è bit a bit- XOR fuori.

cioè

0x1F XOR 0x8 = 10111

+0

Credo che tu intenda 0x10 per 0x16 ??? E 0x16 XOR 0x8 non sta rimuovendo alcun bit perché non hanno bit in comune. – user949300

+0

@ user949300: Sì, grazie. – khampson

4

Ci sono una serie di ragioni si preferirebbe una rappresentazione esadecimale su uno decimale. I più comuni nel calcolo sono bit fields. Alcune persone già citati codici di colore, ad esempio:

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

Si noti che questa rappresentazione del colore è non solo più intuitivo che cercare di capire di che colore un intero casuale come 213.545 potrebbe essere, ma ci vuole anche meno spazio di una tupla 3 come (125, 255, 0) che rappresenta (R,G,B). La rappresentazione esadecimale è un modo semplice per astrarre la stessa idea della 3-tupla con molto meno overhead.

Tenete a mente che del campo di bit hanno molte applicazioni, prendere in considerazione un campo spacetime po ':

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

Un'altra ragione per cui qualcuno potrebbe utilizzare valori esadecimali è perché a volte è più facile da ricordare (e rappresentano) una cifra binaria come due simboli anziché tre. Si consideri lo x86 Instruction Reference. So che la parte superiore della mia testa è che 0xC3 è ret; Trovo più facile memorizzare i numeri esadecimali 00-FF anziché i decimali 0-255 (l'ho cercato e ret termina con lo 195), ma il tuo chilometraggio può variare. Ad esempio, questo è un codice from a project ho lavorato su:

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

ci sono evidenti vantaggi (per non parlare di coerenza) quando si utilizza la notazione esadecimale qui. Infine, come menzionato da Obicere, i codici esadecimali sono spesso usati come codici di errore.A volte sono raggruppati in un modo simile al campo. Per esempio:

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

In base a tale schema, un elenco minimo errore sarà simile:

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

Si noti che questo permette anche di aggiungere nuovi errori sotto 0x0X se tale necessità si porrebbe. Questa risposta ha finito per essere molto più lunga di quanto mi aspettassi, ma spero di far luce.

Problemi correlati