如何清除C#标志枚举中的较高字节

如何清除C#标志枚举中的较高字节,c#,bit-manipulation,enum-flags,C#,Bit Manipulation,Enum Flags,我使用标志枚举来跟踪每个数据记录的数据迁移过程的完成阶段。我需要一种方法来重置回指定的阶段,在那里我可以开始重新处理数据记录的迁移。如何重置标志枚举中较高的字节 示例枚举: [Flags] public Enum MigrationStages { None = 0, Started = 1, MiddleStage = 2, WrappingUp = 4, Finished = 8 } 我的当前值: var currentStage = MigrationSta

我使用标志枚举来跟踪每个数据记录的数据迁移过程的完成阶段。我需要一种方法来重置回指定的阶段,在那里我可以开始重新处理数据记录的迁移。如何重置标志枚举中较高的字节

示例枚举:

[Flags]
public Enum MigrationStages {
  None = 0,
  Started = 1,
  MiddleStage = 2,
  WrappingUp = 4,
  Finished = 8
}
我的当前值:

var currentStage = 
    MigrationStages.None 
    | MigrationStages.Started 
    | MigrationStages.MiddleStage
    | MigrationStages.WrappingUp
    | MigrationStages.Finished;

我想重新设置回迁移阶段。中间阶段导致重新处理从那里开始。

我们不再经常使用逐位数学。因此,当我去寻找这个问题的答案时,我没有发现任何有帮助的东西,所以我找到了答案。与全世界分享我的数学,以防其他人发现它有用

为此,我创建了一个简单的助手方法,如下所示:

public static MigrationStage ClearHigherFlags(MigrationStage orig, MigrationStage highBit)
{
    var lowerBits = (int)orig % (int)highBit;
    return highBit + lowerBits;
}
用法示例:

currentStage = ClearHigherFlags(currentStage, MigrationStages.MiddleStage);
显然,如果您想清除更高的标志,包括
高位
,只需不将其重新添加即可。要清除较低的标志,
返回原点-lowerBits

在位数学中,模(
%
)通常是您的朋友

补遗 有些人会找到这个答案,认为这不是真正的数学问题。我希望这能安抚那些人

首先,回想一下,这是我们正在讨论的一个非常特殊的位操作子集,其中模数使数学更容易阅读,并且非常合适。编译器替换所执行的实际数学将类似于下面的内容,我发现阅读起来不那么直观

public static MigrationStage ClearHigherFlags(MigrationStage orig, MigrationStage highBit)
{
    var bitMask = highBit - 1;
    var lowerBits = orig & bitMask;
    return highBit + lowerBits;
}

读起来并不难,但在我的原始解决方案中,位掩码的转换是隐式完成的。

如果要使用逐位操作,可以这样做:

var lowbits=MigrationStages.MiddleStage | MigrationStages.Started

然后清除示例中的高位:

currentStage=currentStage&lowbits

也许这会更有意义:


8  4  2  1
==========
低位0 0 1 1
当前值1
==========
和(&)0 0 1 1


这会清除两个高位

我不明白你的意思。您还没有显示高位在哪里起作用。问题是我只知道在运行时停止的高位。我不知道要保留的低位。我是说,电脑没有。你看,我把问题简化到了这样一个程度:我可能会跳过迁移中的步骤,或者它们可能会异步运行,所以不是所有较低的步骤都会运行。所以,我不能&所有比highBit低的位。答案必须包括highBit。我希望我的更新能让它更清晰,并包含您试图提出的建议,@Deolus@JackPines在您最初的问题中,您只想返回到
MigrationStages。Middlestage
那么,高位是什么有什么关系呢?在您的附录中,看起来您根本没有更改源代码。@JackPines好的,我对.NETfiddle()做了更多的实验,我可以看到您正在尝试做什么。附录是我做这件事的方式。那会让我很困惑。为什么不是一个好的老的
&
?我想说,
%
是位数学中朋友的对立面,它只在除数是2的幂时才恰好与位数学等价,所以它看起来不合适,直到人们注意到除数是2的幂,即使这样,也可以通过将它理解为按位的或其他方式来理解它