2011-08-17 2 views
23

열거 형은 이와 같이 정의되어 있고 거기에 앞에 0을 붙이는 이유를 알 수 없습니다.오픈 소스 코드 (C++)를 읽고 있는데 왜 이런 식으로 열거 형을 넣었는지 알아낼 수 없습니다.

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 
}; 

나는 이것이 일반적인 int enum이 아니라고 생각한다. "0x"로 시작하는 숫자와 같은 16 진수 일 수 있습니까?

+13

기본 개념은 얼마나 북쪽/남쪽에 있는지 추적 할 수있는 3 비트 (8 진수는 3 비트이고 자릿수와는 무관 함)를 사용하는 것으로 보이고 동쪽/서쪽의 거리를 추적하는 3 비트를 사용하는 것처럼 보입니다 . NNE = N + N + E = 010 + 010 + 001. SWW = S + W + W = -010 + -001 + -001.나는 두 번 칭찬의 부정이 사용법을 더 혼란스럽게 만들었다 고 추측했을 것이다. –

+0

@Mooing Duck : 예 해독 스킬! – orlp

+0

가장 낮은 3 비트는 E/W이지만 다음 3 비트는 N/S에만 모호합니다. –

답변

4

이들은 8- 기반 (편집 : 단어는 8 진수 :) 숫자입니다.

40

이 수는 8 진수입니다. (0으로 시작하는 번호는 0x이 아니며 8 진수로 간주됩니다). == -021 -17 따라서

, = -16 -020 등

2

선행 제로베이스 (8)들을 참조한다. 예 : 021 = 17

+2

당신의 대답은 불완전하다 .0x20은 8 진수가 아니고 아직 0으로 시작한다. – Nawaz

21

사람들은 진수 리터럴 따라서 그들은 나에게 더 흥미 & 진짜 문제가 무엇 0

시작 :
왜 열거 값으로 진수 리터럴을 사용할 수 있나요?

아마도 8 진수 리터럴의 각 비트가 무언가를 나타 내기 때문일 수 있습니다. 열거 형을보고 사용되는 컨텍스트가 없어도 무엇을 만들지는 모르겠지만 그 방향으로 생각해야합니다. 아마도 더 이해하기 쉽습니다. 0으로 시작하는

+0

+ 1 숫자 뒤에있는 숨겨진 속성이 있기 때문에 1 – duedl0r

+0

당신이 말했듯이 비트 연산을 위해이 방법을 사용했습니다 – Oreo23

+0

@ Oreo23 : 다행히 도울 수 있습니다. Q 자체의 비트 사용법에 대해 좀 더 자세히 설명해 주시겠습니까? 흥미 롭다.이 또한 비슷하거나 비슷한 의심을 품을 수있는 다른 사용자를 도울 것이다. –

1

a) 리터럴 상수는 0의 실제 숫자는 허용)
b) 7 진법 (자리 일부를 arithmetics, N 등 = 10 + 2 * (E = 1) = 12 (NEE).

NE> N & & NW> N이므로 원의 방향을 반영하지 않으므로 'SquareDelta'와 같은 제한된 도움이 될 수 있습니다. 어쩌면 문맥에서 더 이해할 수 있습니다.

10

다른 "답변"은 귀하의 질문에 대한 답변이지만 정보를 제공하기 위해 추가하는 것입니다.

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, 
}; 

다시 이진 (조로 상보)에서 :

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, 
}; 

는 그래서 E/W 업무가 SquareDelta&7이고, N/S가 업무 SquareDelta&070+SquareDelta&4이다.

추가 검토 결과, 최하위 8 진수는 -2에서 2 사이의 값으로 W/E-ness를 의미하고 다음 8 진수는 -2에서 2로 조정됩니다 N/S-ness를 의미합니다. DELTA_W+DELTA_W+DELTA_N을 추가하고 두 개의 8 진수로 자르면 012가됩니다. DELTA_NWW입니다. 최하위 8 진수가 상위에 영향을 미치기 때문에 델타는 양수 또는 2로 제한됩니다.

+1

N/S 일을 좀 닮았다. 편집 된 게시물 –

+0

+1 결코 좋았다. 그 종류의 논리. – jp2code

관련 문제