2013-07-27 5 views
6

Я немного знаком с синтаксисом typedef enum для C и C++. Я теперь программирую в Objective-C и натолкнулся на синтаксис в следующем примере. Я не уверен, что синтаксис специфичен для Objective-C или нет. Но, мой вопрос находится в следующем фрагменте кода, что означает синтаксис, например 1 << 0?Что такое синтаксис typedef enum как «1 << 0»?

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

Спасибо Карл за сообщение. Просто FYI, я искал до публикации. Но я не знал, что это называется бит-сдвигом. – MikeyE

+0

Нет проблем, вот для чего мы здесь. =) –

+0

Ответ на этот вопрос здесь: [define SOMETHING '(1 << 0)'] (http: // stackoverflow.com/questions/15095350/define-something-1-0) и понять '<<' operator [vies this] (http://stackoverflow.com/questions/15708493/what-is-the-meaning-of-this -declaration/15708566 # 15708566) –

ответ

10

Это общее для языков C-языков и работает тождественно в C, C++ и Objective-C. В отличие от Java, Pascal и подобных языков, C перечисление не ограничено значениями, названными для него; он фактически является интегральным типом размера, который может представлять все именованные значения, и можно установить переменную типа перечисления в арифметическое выражение в членах перечисления. Как правило, используются битовые сдвиги, чтобы сделать значения величинами равными 2, а один использует битовые логические операции для объединения значений.

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

Опять же, операции битового сдвига все из C.

Теперь вы можете написать:

permission all = read | write | execute; 

Можно даже включить эту строку в самой декларации разрешения:

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

Как вы превращаете execute в файл?

filePermission |= execute; 

Обратите внимание, что это опасно:

filePermission += execute; 

Это изменит что-то со значением all в 8, которая не имеет никакого смысла.

+1

+1 Далеко лучший ответ. –

+1

Отличный ответ. Очень ясный и лаконичный. Благодаря!! – MikeyE

3

Похоже, что typedef представляет значение битового поля. 1 << n является 1 смещено влево n бит. Поэтому каждый элемент enum представляет собой различную настройку бит. Этот определенный бит или четкость указывает на то, что это одно из двух состояний. 1 сдвинутый влево нулевыми битами 1.

Если данность объявлен:

CMAttitudeReferenceFrame foo; 

Затем вы можете проверить любого из четырех независимых государств с использованием enum значений, и foo не больше, чем int. Например:

if (foo & CMAttitudeReferenceFrameXArbitraryCorrectedZVertical) { 
    // Do something here if this state is set 
} 
Смежные вопросы