-2

私は1つの列挙型を持っています

typedef NS_ENUM(NSInteger, Node) {    
    NodeTop     ,      
    NodeLeft    ,
    NodeBottom  ,
    NodeRight   ,
} ;

およびプロパティとして、

@property Node node;

今私のコントローラーでは、パイプラインを使用してノードに複数の値を割り当てています。

node =top | left | bottom | right ;

(Q-1 ノードは、NodeTop,Left OR を使用して 0000,0011 種類の値を持ちますか、単に上|左|下|右の OR の最終結果ですか?)

このようNSLog("%d",node);にして結果1が得られます。

ノードに 0001 が含まれている場合、1ずつ左シフトしたいので、試しました

node<<1;

これはノード値を 1 から 2 に変更しますが、実際には 0001 から 0010 に変更しているようには見えませんか?

要するに、ノードに0001のような値を持たせたいのですが、

そして後で、その値を次のようにシフトしたい

0010

0100

1000

0001

0010 ...

何か助けはありますか?質問が明確でない場合はお知らせください。

4

4 に答える 4

4

を使用NS_OPTIONSして、各値が として定義されるビット マスクを作成できます1<<nこの NSHipster の投稿NS_ENUMでは、との両方の使用法について説明していますNS_OPTIONS

typedef NS_OPTIONS(NSInteger, Node) {    
    NodeTop    = 1 << 0, // 1   
    NodeLeft   = 1 << 1, // 2
    NodeBottom = 1 << 2, // 4
    NodeRight  = 1 << 3  // 8
};

書くときはそのように

NodeTop | NodeBottom

と同じになります

...0001 | ...0100 = ....0101

ビットをシフトすると、次のオプションに移動します

Node node = NodeBottom<<1; // = NodeRight

以来...0100 << ...1000

于 2013-07-12T12:16:07.880 に答える
2

各値を異なるビットに対応させる場合にのみ、意味のある方法でこれらの値をビットごとに OR できます。

typedef NS_ENUM(NSInteger, Node) {    
    NodeTop = 1,      
    NodeLeft = 2,
    NodeBottom = 4,
    NodeRight = 8
};

node = NodeTop;    // 0b0001 = 0x01 = 1
node <<= 1;        // 0b0010 = 0x02 = 2 = NodeLeft
node <<= 1;        // 0b0100 = 0x04 = 4 = NodeBottom
于 2013-07-12T10:48:23.200 に答える