【问题标题】:Incrementing part of bit mask增加位掩码的一部分
【发布时间】:2014-03-17 22:53:01
【问题描述】:

给定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;

这是最简单的方法吗?

【问题讨论】:

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


    【解决方案1】:

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

    你已经设置了你的枚举,所以前 3 位代表一个速度值。您的值最高可达 7。

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

    您希望设置一些速度值和一些其他位。然后,您希望能够在保持其他位不变的同时增加该速度。

    这很简单。

    breathingProgram++;
    

    您只需要一个简单的增量。例子。假设您的速度设置为“慢”并且设置了“保持”位。这给出了 9 的值(1 表示“慢”,8 表示“保持”)。

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

    虽然这可行,但您可能会过度增加值并开始弄乱标志。

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

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

    这可确保您无法将增量超过分配的“步速”值并进入标志区域。如果你走得太远,这实际上会将“速度”值回零。

    【讨论】:

    • 我打算将前 3 位用作 Pace 值,其余用作位掩码,BREBreathingProgramExcludeHold 是第一位。那不是(部分)位掩码吗?
    • 简单地说——不会增加整个NSUInteger 改变BREBreathingProgramExcludeHold 和其他我打算添加的位吗?
    • 那是没有意义的。你是什​​么意思?就目前而言,您的枚举并未真正设置为位掩码。您为什么不在您的问题中提供更多关于如何使用它并提供一些示例的详细信息。
    • 基本上,我想做一些类似UIViewAnimationOptions 的事情,其中​​一些位是值的一部分(如转换或曲线),一些用作标志(如 AllowUserInteraction)。就我而言,我想要 Pace(会增加和减少)和一堆像 ExcludeHold 这样的标志。
    • 顺便说一句 - 使用掩码 0xF8 只有在总共使用 8 位时才有效。如果您需要 16 或 32 或其他任何值,请相应地调整该掩码 - 0xFFF8 用于 16 位等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多