循环移位BITMASK的问题

时间:2013-07-12 10:45:06

标签: iphone ios enums bitwise-operators bit-shift

我有一个枚举

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

和属性为,

@property Node node;

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

node =top | left | bottom | right ;

(Q-1节点使用NodeTop有0000,0011种值,左或者只是OR | top | left | right的最终结果?)

这样NSLog("%d",node);给出结果1。

现在如果节点包含0001,我想将它左移1,所以我试过

node<<1;

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

简而言之,我希望节点的值为0001,

以后我想改变它的价值,

0010

0100

1000

0001

0010 ...

有任何帮助吗?如果问题不明确,请告诉我!

4 个答案:

答案 0 :(得分:4)

您可以使用NS_OPTIONS创建位掩码,其中每个值都定义为1<<nThis NSHipster post解释了NS_ENUMNS_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

答案 1 :(得分:3)

  

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

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

答案 2 :(得分: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

答案 3 :(得分: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