Domanda

Ehi! Stavo guardando questo codice su http://www.gnu.org/ software / m68hc11 / examples / primes_8c-source.html

Ho notato che in alcune situazioni hanno usato numeri esadecimali, come nella riga 134:

for (j = 1; val && j <= 0x80; j <<= 1, q++)

Ora perché dovrebbero usare lo 0x80? Non sono così bravo con hex ma ho trovato un hex online in decimale e mi ha dato 128 per 0x80.

Anche prima della riga 134, sulla riga 114 hanno questo:

small_n = (n & 0xffff0000) == 0;

L'esagono in decimale mi ha dato 4294901760 per quel numero esadecimale. Quindi qui in questa riga stanno facendo un po 'AND e confrontando il risultato con 0 ??

Perché non usare semplicemente il numero? Qualcuno può spiegare e per favore fornire esempi di altre situazioni.

Inoltre ho visto grandi righe di codice in cui sono solo numeri esadecimali e non ho mai capito perché :(

È stato utile?

Soluzione

In entrambi i casi citati, il modello di bit del numero è importante, non il numero effettivo.

Ad esempio, Nel primo caso, j sarà 1, quindi 2, 4, 8, 16, 32, 64 e infine 128 man mano che il ciclo avanza.

In binario, cioè

0000: 0001 , 0000: 0010 , 0000: 0100 , 0000: 1000 , 0001: 0000 , 0010: 0000 , 0100: 0000 e 1000: 0000 .

Non esiste alcuna opzione per le costanti binarie in C o C ++, ma è un po 'più chiara in esadecimale: 0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x40 e 0x80 .

Nel secondo esempio, l'obiettivo era rimuovere i due byte inferiori del valore. Quindi dato un valore di 1.234.567.890 vogliamo finire con 1.234.567.168.
In esadecimale, è più chiaro: inizia con 0x4996: 02d2 , termina con 0x4996: 0000 .

Altri suggerimenti

Esiste una mappatura diretta tra cifre esadecimali (o ottali per quella materia) e i pattern di bit sottostanti, che non è il caso con i decimali. Un '9' decimale rappresenta qualcosa di diverso rispetto ai modelli di bit in base alla colonna in cui si trova e ai numeri che lo circondano - non ha una relazione diretta con un modello di bit. In esadecimale, un "9" significa sempre "1001", indipendentemente dalla colonna. 9 = '1001', 95 = '* 1001 * 0101' e così via.

Come traccia dei miei giorni a 8 bit trovo hex una comoda scorciatoia per qualsiasi cosa binaria. Bit twiddling è un'abilità morente. Una volta (circa 10 anni fa) ho visto un documento di networking del terzo anno all'università in cui solo il 10% (5 su 50 circa) delle persone in classe poteva calcolare una maschera di bit.

è un po 'maschera. I valori esadecimali semplificano la visualizzazione della rappresentazione binaria sottostante. n & amp; 0xffff0000 restituisce i primi 16 bit di n. 0xffff0000 significa " 16 1s e 16 0s in binario "

0x80 significa " 1000000 " ;, quindi inizi con " 00000001 " e continua a spostare quel bit verso sinistra "0000010", "0000100", ecc. fino a "1000000"

0xffff0000 è facile da capire che è 16 volte "1" e 16 volte "0" in un valore di 32 bit, mentre 4294901760 è magico.

Trovo esasperante che la famiglia di lingue C abbia sempre supportato ottale ed esadecimale ma non binario. Ho desiderato a lungo che avrebbero aggiunto il supporto diretto per il binario:

int mask = 0b00001111;

Molti anni / lavori fa, mentre lavoravo a un progetto che comportava un'enorme quantità di matematica a livello di bit, mi sono stufato e ho generato un file di intestazione che conteneva costanti definite per tutti i possibili valori binari fino a 8 bit:

#define b0        (0x00)
#define b1        (0x01)
#define b00       (0x00)
#define b01       (0x01)
#define b10       (0x02)
#define b11       (0x03)
#define b000      (0x00)
#define b001      (0x01)
...
#define b11111110 (0xFE)
#define b11111111 (0xFF)

Di tanto in tanto ha reso più leggibile un certo codice a livello di bit.

A volte la rappresentazione visiva dei valori in HEX rende il codice più leggibile o comprensibile. Ad esempio il bitmasking o l'uso di bit diventa non ovvio quando si osservano rappresentazioni decimali di numeri.

Questo a volte può fare con la quantità di spazio che un determinato tipo di valore ha da offrire, quindi anche questo può avere un ruolo.

Un tipico esempio potrebbe essere in un'impostazione binaria, quindi invece di usare il decimale per mostrare alcuni valori, usiamo il binario.

supponiamo che un oggetto avesse un insieme non esclusivo di proprietà con valori di on o off (3 di loro) - un modo per rappresentare lo stato di quelle proprietà è con 3 bit.

Le

rappresentazioni valide sono da 0 a 7 in decimale, ma non è così ovvio. più ovvia è la rappresentazione binaria:

000, 001, 010, 011, 100, 101, 110, 111

Inoltre, alcune persone sono a proprio agio con hex. Nota anche che i numeri magici codificati sono proprio questo e non è poi così importante utilizzare il sistema di numerazione

Spero che sia d'aiuto.

Generalmente l'uso di numeri esadecimali anziché decimali è perché il computer funziona con i bit (numeri binari) e quando si lavora con i bit è anche più comprensibile usare numeri esadecimali, perché è più facile passare da esadecimali a binari che da Da decimale a binario.

OxFF = 1111 1111 ( F = 1111 )

ma

255 = 1111 1111 

perché

255 / 2 = 127 (rest 1)
127 / 2 = 63 (rest 1)
63 / 2 = 31 (rest 1)
... etc

Riesci a vederlo? Passare dall'esagono al binario è molto più semplice.

L'uso più grande di hex è probabilmente nella programmazione integrata. I numeri esadecimali vengono utilizzati per mascherare singoli bit nei registri hardware o per dividere più valori numerici raggruppati in un singolo registro a 8, 16 o 32 bit.

Quando si specificano le singole maschere di bit, molte persone iniziano con:

#define bit_0 1
#define bit_1 2
#define bit_2 4
#define bit_3 8
#define bit_4 16
etc...

Dopo un po 'avanzano a:

#define bit_0 0x01
#define bit_1 0x02
#define bit_2 0x04
#define bit_3 0x08
#define bit_4 0x10
etc...

Quindi imparano a imbrogliare e lasciano che il compilatore generi i valori come parte dell'ottimizzazione del tempo di compilazione:

#define bit_0 (1<<0)
#define bit_1 (1<<1)
#define bit_2 (1<<2)
#define bit_3 (1<<3)
#define bit_4 (1<<4)
etc...

Ci sono 8 bit in un byte. La sfortuna, base 16, è concisa. Qualsiasi valore di byte possibile viene espresso utilizzando due caratteri della raccolta 0..9, più a, b, c, d, e, f.

Base 256 sarebbe più concisa. Ogni possibile byte potrebbe avere il suo carattere singolo, ma la maggior parte delle lingue umane non usa 256 caratteri, quindi Hex è il vincitore.

Per capire l'importanza di essere concisi, considera che negli anni '70, quando volevi esaminare il tuo megabyte di memoria, era stampato in esadecimale. La stampa userebbe diverse migliaia di pagine di carta grande. Octal avrebbe sprecato ancora più alberi.

Per essere più precisi, esadecimali e decimali, sono tutti NUMERI. Le radix (base 10, 16, ecc.) Sono modi per presentare quei numeri in modo più chiaro o più conveniente.

Quando parliamo di " quante cose ci sono " usiamo normalmente i decimali. Quando guardiamo indirizzi o schemi di bit sui computer, di solito si preferisce hex, perché spesso il significato dei singoli byte potrebbe essere importante.

Hex, (e ottale) hanno la proprietà di essere poteri di due, quindi mappano raggruppamenti di bit in modo gradevole. Hex mappa 4 bit su un nibble esadecimale (0-F), quindi un byte è memorizzato in due nibble (00-FF). Octal era popolare su Digital Equipment (DEC) e altre macchine più vecchie, ma una cifra ottale è mappata a tre bit, quindi non attraversa i confini dei byte altrettanto bene.

Nel complesso, la scelta di radix è un modo per semplificare la programmazione: utilizzare quello che corrisponde meglio al dominio.

I numeri esadecimali o esadecimali rappresentano 4 bit di dati, da 0 a 15 o in HEX da 0 a F. Due valori esadecimali rappresentano un byte.

Guardando il file, si tratta di un codice piuttosto groady. Spero che tu sia bravo in C e non lo usi come tutorial ...

Hex è utile quando lavori direttamente a livello di bit o appena sopra di esso. Ad esempio, lavorando su un driver in cui stai guardando direttamente i bit provenienti da un dispositivo e twiddling i risultati in modo che qualcun altro possa leggere un risultato coerente. È una rappresentazione compatta del binario abbastanza facile da leggere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top