计算按位值的数量

时间:2014-05-30 09:33:33

标签: objective-c c

我遇到了一个简单的问题,我找到了一个解决方案:)。

如果我们有这样的话:

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};

和这样的属性:

@property (nonatomic, assign) UIViewAutoresizing autoresizingMask;

和此:

self.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth ;

问题是:如何知道UIViewAutoresizing属性中的项目数(autoresizingMask)? (在我的例子中我有2个)

3 个答案:

答案 0 :(得分:2)

__builtin_popcount函数,通常转换为大多数现代硬件上的单个指令。它基本上给出了整数中的设置位数。

答案 1 :(得分:0)

计算选项数量并不常见,通常只需要分别询问您感兴趣的每个选项。

在这种情况下,您可以遍历所有32(64)位并检查有多少位设置为1(天真的解决方案)。

有关更高级的解决方案,请参阅:How to count the number of set bits in a 32-bit integer?

注意,仅当每个选项都指定为1位时,此方法才有效。我仍然建议分别检查每个选项。

if ((self.autoresizingMask & UIViewAutoresizingFlexibleRightMargin) != 0) {
   //do something
}

答案 2 :(得分:0)

有两种方法可以做到这一点。

您可以逐个检查包含,然后跟踪哪些或多少。

或者,您创建一组掩码,覆盖所有组合并针对精确匹配进行测试。 (更多样板代码,随着枚举选项的数量增加)