增加部分位掩码

时间:2014-03-17 22:53:01

标签: objective-c c enums bit-manipulation bitmask

鉴于enum

typedef NS_OPTIONS(NSUInteger, BREBreathingProgram) {
    BREBreathingProgramPaceSlowest = 0,
    BREBreathingProgramPaceSlow = 1,
    BREBreathingProgramPaceMedium = 2,
    BREBreathingProgramPaceFast = 3,
    BREBreathingProgramPaceFastest = 4,
    BREBreathingProgramExcludeHold = 1 << 3,
};

要递增BreathingProgramPace,请执行以下计算:

breathingProgram = ((breathingProgram >> 3) & 1) << 3 | (breathingProgram & 3) + 1;

这是最简单的方法吗?

1 个答案:

答案 0 :(得分:2)

根据您对此答案的第2条评论,我正在重写答案。

您已设置枚举,因此前3位代表节奏的单个值。您的值最多可以为7。

第四位代表你的“保持”。

您希望获得一些节奏值以及其他一些位设置。然后,您希望能够在保持其他位的同时增加该速度。

这很简单。

breathingProgram++;

您只需要一个简单的增量即可。例。让我们说你的步速设置为“慢”并设置“保持”位。这给出了值9(“慢”为1,“保持”为8)。

现在您希望将速度增加到“中等”。只需从9增加到10即可。

虽然这样做有效但是你可能会过度增加值并开始弄乱标志。

更安全(也更复杂)的方式是:

breathingProgram = (breathingProgram & 0xF8) | (((breathingProgram & 0x07) + 1) & 0x07);

这可确保您无法通过分配的“节奏”值进入增量并进入标记区域。如果你走得太远,这实际上会将“节奏”值包回零。