计算NSData中设置的位。也许使用枚举?目标C.

时间:2015-03-07 14:25:22

标签: ios objective-c

我不知道如何解决这个问题。

我收到了一个数据字节,用于定义硬件中可用的哪些颜色LED。

红色,绿色,蓝色和白色有4个LED。

bit 0 = Red (1 On | 0 Off)
bit 1 = Green (1 On | 0 Off)
bit 2 = Blue (1 On | 0 Off)
bit 3 = White (1 On | 0 Off)
bit 4 = Unused / Future Use
bit 5 = Unused / Future Use
bit 6 = Unused / Future Use
bit 7 = Unused / Future Use

如果从硬件获得int值11,则位掩码为:0000 1011(Little Endian),因此使用的LED为白色,绿色和红色。

如果我得到一个int值15,那么所有的LED都在使用中,如果它是7,那么除了白色外都在使用。

我想要解决的问题是评估所设置的位然后显示哪些LED可用的好方法。

评估设置哪些位然后以NSString形式显示给用户的最佳方法是什么。

我是否应该使用如下的枚举,然后尝试评估,我将如何进行评估?

typedef enum {

    RedLEDAvailable    = 1 << 0,
    GreenLEDAvailable  = 1 << 1,
    BlueLEDAvailable   = 1 << 2,
    WhiteLEDAvailable  = 1 << 3

} LEDStatus;

提前致谢。

1 个答案:

答案 0 :(得分:2)

是的,每个LED都有一个位掩码,然后您可以比较从硬件获得的值,以确定哪些LED可用。

评估位掩码非常简单,您可以使用&|运算符来&#34;和&#34;或&#34;或&#34;这些比特在一起。

作为其工作原理的示例,取数字0001和0101(二进制)。如果你|将它们放在一起,计算机会依次查看每个数字,看看两个数字中的一个或两个数字在每个位置是否为1,如果是这种情况,则结果会在该位置进行1。 / p>

如果你&他们在一起,那么只有当BOTH位掩码中有1时,才会将1放在该位置。

很抱歉,如果这有点乱,但基本上这意味着0001&amp; 0101 = 0001.和0001 | 0101 = 0101。

这意味着如果您想要结合位掩码,可以使用|运算符,如果要对它们进行求值,可以使用&运算符。

E.g:

if ((LEDsAvailable & RedLEDAvailable) == RedLEDAvailable) {
    // Red light ready
}
else {
    // Red light not ready
}

在将此字符串显示给用户方面,您只需创建NSMutableString并根据位掩码的评估方式附加相应的消息。