我有一个枚举
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 ...
有任何帮助吗?如果问题不明确,请告诉我!
答案 0 :(得分:4)
您可以使用NS_OPTIONS
创建位掩码,其中每个值都定义为1<<n
。 This NSHipster post解释了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
。
答案 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