如何清除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的幂,即使这样,也可以通过将它理解为按位的或其他方式来理解它