Objective c 计算按位值的数目

Objective c 计算按位值的数目,objective-c,c,Objective C,C,我面临一个简单的问题,因为我已经找到了解决方法:) 例如,如果我们有: typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) { UIViewAutoresizingNone = 0, UIViewAutoresizingFlexibleLeftMargin = 1 << 0, UIViewAutoresizingFlexibleWidth = 1 <<

我面临一个简单的问题,因为我已经找到了解决方法:)

例如,如果我们有:

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
};
这是:

self.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth ;

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

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

if ((self.autoresizingMask & UIViewAutoresizingFlexibleRightMargin) != 0) {
   //do something
}
然而,在这种情况下,您可以遍历所有32(64)位,并检查有多少位设置为1(简单的解决方案)

有关更高级的解决方案,请参阅:

注意:只有当每个选项都由精确的1位指定时,此选项才起作用。我仍然建议分别检查每个选项

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

还有
\uuuu内置的popcount
函数,在大多数现代硬件上通常转换为一条指令。它基本上给出整数中的设置位数。

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

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

或者,创建一组覆盖所有组合的遮罩,并针对这些遮罩进行测试,以获得精确匹配。
(更多的样板代码,随着枚举选项的增加而增加)

在iOS应用程序中使用它安全吗?只要它能够编译,我想是的。