2013-07-27 31 views
6

Tôi khá quen thuộc với cú pháp gõ vào chữ C và C++. Tôi bây giờ lập trình trong Objective-C và đi qua cú pháp trong ví dụ sau. Tôi không chắc liệu cú pháp có phải là Objective-C cụ thể hay không. Nhưng, câu hỏi của tôi là trong đoạn mã sau, cú pháp như 1 << 0 là gì?Cú pháp gõ typedef enum như '1 << 0' có nghĩa là gì?

typedef enum { 
    CMAttitudeReferenceFrameXArbitraryZVertical = 1 << 0, 
    CMAttitudeReferenceFrameXArbitraryCorrectedZVertical = 1 << 1, 
    CMAttitudeReferenceFrameXMagneticNorthZVertical = 1 << 2, 
    CMAttitudeReferenceFrameXTrueNorthZVertical = 1 << 3 
} CMAttitudeReferenceFrame; 
+0

Cảm ơn Carl về bài đăng. Chỉ cần một FYI, tôi đã tìm kiếm trước khi đăng. Nhưng tôi không biết nó được gọi là dịch chuyển bit. – MikeyE

+0

Không sao, đó là những gì chúng tôi đang ở đây. =) –

+0

Bạn đã trả lời câu hỏi ở đây: [define SOMETHING '(1 << 0)'] (http: // stackoverflow.com/questions/15095350/define-something-1-0) và để hiểu toán tử '<<' [vies this] (http://stackoverflow.com/questions/15708493/what-is-the-meaning-of-this -declaration/15708566 # 15708566) –

Trả lời

10

Điều này phổ biến đối với nhóm ngôn ngữ C, và hoạt động giống nhau trong C, C++ và Mục tiêu-C. Không giống như Java, Pascal, và các ngôn ngữ tương tự, một enum C không giới hạn các giá trị được đặt tên cho nó; nó thực sự là một loại không thể thiếu của một kích thước có thể đại diện cho tất cả các giá trị được đặt tên, và người ta có thể thiết lập một biến của kiểu enum thành một biểu thức số học trong các thành viên enum. Thông thường, một sử dụng bit dịch chuyển để làm cho các giá trị quyền hạn của 2, và một sử dụng bit-khôn ngoan hoạt động hợp lý để kết hợp các giá trị.

typedef enum { 
    read = 1 << 2, // 4 
    write = 1 << 1, // 2 
    execute = 1 << 0 // 1 
} permission; // A miniature version of UNIX file-permission masks 

Một lần nữa, các hoạt động bit thay đổi đều từ C.

Bây giờ bạn có thể viết:

permission all = read | write | execute; 

Bạn thậm chí có thể bao gồm dòng trong tờ khai cho phép bản thân:

typedef enum { 
    read = 1 << 2, // 4 
    write = 1 << 1, // 2 
    execute = 1 << 0, // 1 
    all  = read | write | execute // 7 
} permission; // Version 2 

Làm cách nào để bạn bật execute cho một tệp?

filePermission |= execute; 

Lưu ý rằng đây là nguy hiểm:

filePermission += execute; 

này sẽ thay đổi một cái gì đó có giá trị all-8, mà làm cho không có ý nghĩa.

+1

+1 Đến nay câu trả lời tốt nhất. –

+1

Câu trả lời hay. Rất rõ ràng và súc tích. Cảm ơn!! – MikeyE

3

Có vẻ như typedef đại diện cho giá trị trường bit. 1 << n1 dịch chuyển sang trái n bit. Vì vậy, mỗi mục enum đại diện cho một cài đặt bit khác nhau. Bộ bit cụ thể hoặc rõ ràng sẽ chỉ ra một cái gì đó là một trong hai trạng thái. 1 dịch chuyển sang trái bằng 0 bit là 1.

Nếu mốc đo lường được tuyên bố:

CMAttitudeReferenceFrame foo; 

Sau đó, bạn có thể kiểm tra bất kỳ một trong bốn quốc gia độc lập bằng cách sử dụng enum giá trị, và foo là không lớn hơn một int. Ví dụ:

if (foo & CMAttitudeReferenceFrameXArbitraryCorrectedZVertical) { 
    // Do something here if this state is set 
} 
Các vấn đề liên quan