2013-07-27 14 views
6

Ich bin etwas vertraut mit der Typedef enum Syntax von C und C++. Ich programmiere jetzt in Objective-C und bin im folgenden Beispiel auf die Syntax gestoßen. Ich bin mir nicht sicher, ob die Syntax Objective-C-spezifisch ist oder nicht. Aber meine Frage ist im folgenden Codeschnipsel, was bedeutet Syntax wie 1 << 0?Was bedeutet typedef Enum-Syntax wie '1 << 0'?

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

Danke Carl für die Post. Nur ein FYI, ich habe vor dem Posten gesucht. Aber ich wusste nicht, dass es Bitverschiebung genannt wurde. – MikeyE

+0

Kein Problem, dafür sind wir da. =) –

+0

Sie Frage beantwortet hier: [definieren SOMETHING '(1 << 0)'] (http: // stackoverflow.com/questions/15095350/define-something-1-0) und zu verstehen '<<' operator [vies this] (http://stackoverflow.com/questions/15708493/what-is-the-meaning-of-this -declaration/15708566 # 15708566) –

Antwort

10

Dies ist der C-Familie von Sprachen gemeinsam und funktioniert identisch in C, C++ und Objective-C. Im Gegensatz zu Java, Pascal und ähnlichen Sprachen ist ein C enum nicht auf die dafür angegebenen Werte beschränkt. Es ist tatsächlich ein ganzzahliger Typ einer Größe, die alle benannten Werte darstellen kann, und eine Variable des Aufzählungstyps kann auf einen arithmetischen Ausdruck in den Enum-Elementen festgelegt werden. Typischerweise verwendet man Bit-Verschiebungen, um die Werte zu Potenzen von 2 zu machen, und man verwendet bitweise logische Operationen, um Werte zu kombinieren.

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

Auch hier sind die Bit-Schichtbetrieb alle von C. sind

können Sie jetzt schreiben:

:

permission all = read | write | execute; 

Sie auch diese Zeile in der Berechtigungserklärung selbst enthalten könnte

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

Wie schalten Sie execute für eine Datei ein?

filePermission |= execute; 

Beachten Sie, dass dies gefährlich ist:

filePermission += execute; 

Das ist etwas mit Wert all-8 ändern wird, was keinen Sinn macht.

+1

+1 Mit Abstand die beste Antwort. –

+1

Große Antwort. Sehr klar und prägnant. Vielen Dank!! – MikeyE

3

Es sieht so aus, als ob der typedef einen Bitfeldwert darstellt. 1 << n ist 1 nach links verschoben n Bits. So repräsentiert jedes Element enum eine andere Biteinstellung. Dieses bestimmte Bit gesetzt oder klar würde anzeigen, dass etwas einer von zwei Zuständen ist. 1 von Null Bits nach links verschoben ist 1.

Wenn ein Datum erklärt wird:

CMAttitudeReferenceFrame foo; 

Dann können Sie eine von vier unabhängigen Staaten überprüfen Sie die enum Werte verwenden und foo ist nicht größer als ein int. Zum Beispiel:

if (foo & CMAttitudeReferenceFrameXArbitraryCorrectedZVertical) { 
    // Do something here if this state is set 
}