2011-08-17 11 views
23

Ho trovato enum essere definito in questo modo e non riesco a capirlo perché hanno messo lo zero iniziale lì.Sto leggendo il codice open source (C++) e non riesco a capire perché hanno messo enum in questo modo

enum SquareDelta { 
    DELTA_SSW = -021, 
    DELTA_SS = -020, 
    DELTA_SSE = -017, 
    DELTA_SWW = -012, 
    DELTA_SW = -011, 
    DELTA_S = -010, 
    DELTA_SE = -07, 
    DELTA_SEE = -06, 
    DELTA_W = -01, 
    DELTA_ZERO = 0, 
    DELTA_E = 01, 
    DELTA_NWW = 06, 
    DELTA_NW = 07, 
    DELTA_N = 010, 
    DELTA_NE = 011, 
    DELTA_NEE = 012, 
    DELTA_NNW = 017, 
    DELTA_NN = 020, 
    DELTA_NNE = 021 
}; 

Immagino che questo non sia solo normale, ma che cos'è? potrebbe essere in esadecimale come il numero che inizia con "0x"?

+13

Il concetto di base sembra utilizzare tre bit (un ottale è 3 bit, niente a che fare con il numero di cifre) per tenere traccia di quanto lontano nord/sud e tre bit per tenere traccia di quanto lontano est/ovest . NNE = N + N + E = 010 + 010 + 001. SWW = S + W + W = -010 + -001 + -001.Avrei intuito che i negativi a due complimenti rendono l'uso più confuso però. –

+0

@Mooing Duck: Yay capacità di decodifica! – orlp

+0

Indovinate, i 3 bit più bassi sono E/W, ma i 3 bit successivi corrispondono solo vagamente a N/S. –

risposta

4

Questi sono basati su 8 (Modifica: la parola è ottale :)) numeri.

40

Questi numeri sono costanti ottali. (I numeri che precedono con 0 ma non con 0x sono considerati in base-8).

Così, -021 == -17, -020 = -16, ecc

2

zero loro base di 8 numeri fa. per esempio. 021 = 17

+2

Non necessario La risposta è incompleta. '0x20' non è un numero ottale, ma inizia con' 0'. – Nawaz

21

Quelli sono letterali ottale e, quindi, iniziamo con 0.

ciò che è più interessante & vera questione per me è:
perché utilizzare ottale letterali come valori enum?

Probabilmente, perché ogni bit di quei letterali ottali è indicativo di qualcosa. È difficile capire cosa, solo vedendo l'enum e nessun contesto in cui viene usato, ma è necessario pensarci in quella direzione, e forse avrà più senso per te.

+0

+ 1 perché probabilmente c'è una proprietà nascosta dietro quei numeri – duedl0r

+0

È come hai detto tu. È stato fatto in questo modo per operazioni a bit. – Oreo23

+0

@ Oreo23: Glad potrebbe aiutare. Puoi approfondire l'uso dei bit nella Q stessa, è interessante, inoltre aiuterà alcuni altri utenti che potrebbero essere bloccati a questo stesso/simile dubbio –

1

a) costanti letterali, iniziano con 0 sono ottale (cifre da 0 a 7)
b) I numeri reali permettono alcune aritmetica, come N = 10 + 2 * (E = 1) = 12 (NEE).

Ma poiché NE> N & & NW> N, non riflette una direzione nel cerchio, quindi è, forse, di aiuto limitato, come la parola 'SquareDelta' per me. Forse ha più senso nel contesto.

10

Le altre "risposte" rispondono alla tua domanda, ma la sto aggiungendo a scopo informativo.

enum SquareDelta { 
       DELTA_NNW= 017,DELTA_NN = 020,DELTA_NNE= 021 
DELTA_NWW= 006,DELTA_NW = 007,DELTA_N = 010,DELTA_NE = 011,DELTA_NEE= 012, 
       DELTA_W =-001,DELTA_ZER= 000,DELTA_E = 001, 
DELTA_SWW=-012,DELTA_SW =-011,DELTA_S =-010,DELTA_SE =-007,DELTA_SEE=-006, 
       DELTA_SSW=-021,DELTA_SS =-020,DELTA_SSE=-017, 
}; 

Ancora, in binario (due a due complimento):

enum SquareDelta { 
       DELTA_NNW=001111,DELTA_NN =010000,DELTA_NNE=010001 
DELTA_NWW=000110,DELTA_NW =000111,DELTA_N =001000,DELTA_NE =001001,DELTA_NEE=001010, 
       DELTA_W =111111,DELTA_ZER=000000,DELTA_E =000001, 
DELTA_SWW=110110,DELTA_SW =110111,DELTA_S =111000,DELTA_SE =111001,DELTA_SEE=111010, 
       DELTA_SSW=101111,DELTA_SS =110000,DELTA_SSE=110001, 
}; 

Così la E/W coordinate viene SquareDelta&7, e la N/S coordinate viene SquareDelta&070+SquareDelta&4.

Dopo un'ulteriore revisione, sembra che intendessero per la cifra ottale meno significativa essere su una scala da -2 a 2 per indicare il W/E-ness, e la prossima cifra ottale per scalare da -2 a 2 per indicare il N/S-ness. Se aggiungi DELTA_W+DELTA_W+DELTA_N e troncati a due cifre ottali, ottieni 006, il valore di DELTA_NWW. Poiché l'ottale meno significativo influisce sulla tomaia, i delta sono limitati a più o meno due.

+1

Ho capito che la cosa N/S è un po ', post modificato –

+0

+1 Non sono mai stato bravo a quel tipo di logica. – jp2code

Problemi correlati