-2

我有一个枚举

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

和财产,

@property Node node;

现在在我的控制器中,我正在使用管道为节点分配多个值,

node =top | left | bottom | right ;

(Q-1 节点是否有 0000,0011 种值,使用 NodeTop,Left 或只是顶部 | 左 | 底部 | 右的 ORing 的最终结果?)

这种方式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 回答
3

它将节点值 1 更改为 2,但似乎并没有真正将 0001 更改为 0010?

确实如此。0010二进制是2十进制。

于 2013-07-12T10:46:54.347 回答
2

如果您使每个值对应于不同的位,则只能以有意义的方式将这些值按位或在一起,例如

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 回答
2

至于循环位移,我认为你能做的最好的事情就是这样(快速组合C代码)

enum test { 
    test1 = 1,
    test2 = 2,
    test4 = 4,
    test8 = 8
};

static enum test val(enum test input) {
    while(input >= 16) //Or whatever max bit you want
        input = input >> 4; //Be sure to shift by the appropriate number

    return input;
}

然后当您运行此代码时:

enum test foo = test1;
foo = val(foo << 5);

foo将会test2

于 2013-07-12T11:09:02.167 回答