2011-08-17 15 views
23

Tôi tìm thấy enum được xác định như thế này và không thể tìm ra lý do tại sao chúng đặt số 0 đứng đầu ở đó.Tôi đang đọc mã nguồn mở (C++) và không thể tìm ra lý do tại sao chúng đặt enum theo cách này

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

Tôi đoán đây không chỉ là int enum bình thường mà là gì? nó có thể được trong hex giống như số bắt đầu với "0x"?

+13

Khái niệm cơ bản dường như sử dụng ba bit (bát phân là 3 bit, không có gì để làm với số chữ số) để theo dõi khoảng cách về phía bắc/nam và ba bit để theo dõi cách xa về phía đông/tây . NNE = N + N + E = 010 + 010 + 001. SWW = S + W + W = -010 + -001 + -001.Tôi đã có thể đoán rằng âm bản trong twos khen làm cho việc sử dụng khó hiểu hơn mặc dù. –

+0

@Mooing Duck: Kỹ năng giải mã Yay! – orlp

+0

Đoán không, 3 bit thấp nhất là E/W, nhưng 3 bit tiếp theo chỉ mơ hồ tương ứng với N/S. –

Trả lời

4

Đó là các số 8 (Chỉnh sửa: từ là bát phân :)).

40

Những số đó là hằng số bát phân. (Các số dẫn đầu với 0 nhưng không phải là 0x được xem là cơ sở-8).

Do đó, -021 == -17, -020 = -16, v.v.

2

Số 0 đứng đầu làm cho chúng có 8 số. ví dụ. 021 = 17

+2

Không cần thiết. Câu trả lời của bạn chưa hoàn thành. '0x20' không phải là số bát phân, nhưng nó bắt đầu bằng' 0'. – Nawaz

21

Đó là những chữ bát phân và do đó họ bắt đầu với 0.

gì là thú vị hơn & Câu hỏi thật với tôi là:
Tại sao phải sử dụng Octal Literals như các giá trị enum?

Có thể, bởi vì mỗi bit của các chữ số bát phân đó biểu thị một thứ gì đó. Thật khó để tạo ra cái gì, chỉ bằng cách nhìn thấy enum và không có bối cảnh mà nó đang được sử dụng, nhưng bạn cần phải suy nghĩ về nó theo hướng đó, và có lẽ nó sẽ có ý nghĩa hơn cho bạn.

+0

+ 1 bởi vì có lẽ có một tài sản ẩn đằng sau những con số đó – duedl0r

+0

Nó giống như bạn đã nói, nó được thực hiện theo cách này cho hoạt động bit – Oreo23

+0

@ Oreo23: Vui mừng có thể giúp bạn có thể giải thích thêm một chút về việc sử dụng bit trong chính Q là thú vị, Ngoài ra nó sẽ giúp một số người dùng khác, những người có thể bị mắc kẹt tại cùng một nghi ngờ tương tự/này –

1

a) Hằng số nguyên, bắt đầu bằng 0 là bát phân (chữ số từ 0 đến 7)
b) Số thực cho phép một số mỹ phẩm, như N = 10 + 2 * (E = 1) = 12 (NEE).

Nhưng kể từ NE> N & & NW> N, nó không phản ánh hướng trong vòng tròn, vì vậy, có thể, trợ giúp hạn chế, như từ 'SquareDelta' cho tôi. Có lẽ, nó có ý nghĩa hơn trong ngữ cảnh.

10

"câu trả lời" khác trả lời câu hỏi của bạn, nhưng tôi đang thêm mục này cho mục đích thông tin.

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

Một lần nữa, trong hệ nhị phân (lời khen twos):

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

Vì vậy, E/W Phối hợp là SquareDelta&7, và N/S Phối hợp là SquareDelta&070+SquareDelta&4. Khi xem xét thêm, có vẻ như chúng dành cho chữ số bát phân ít quan trọng nhất trên thang điểm từ -2 đến 2 để biểu thị W/E-ness và chữ số bát phân tiếp theo để chia tỷ lệ từ -2 đến 2 để biểu thị N/S-Ness. Nếu bạn thêm DELTA_W+DELTA_W+DELTA_N và cắt ngắn thành hai chữ số bát phân, bạn nhận được 006, giá trị là DELTA_NWW. Vì bát phân ít quan trọng nhất ảnh hưởng đến phần trên, các đồng bằng được giới hạn ở mức cộng hoặc trừ hai.

+1

Đã tìm ra điều N/S kinda, bài chỉnh sửa –

+0

+1 Tôi chưa bao giờ giỏi loại logic đó. – jp2code

Các vấn đề liên quan