Đ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.
Nguồn
2013-07-27 02:45:57
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
Không sao, đó là những gì chúng tôi đang ở đây. =) –
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) –