在C#中执行位或的反向操作(或称反转)。

8
在C#中如何执行按位OR(| =)运算符的反操作? C#中是否有NOR按位运算符可以使用?
情景:
我从.NET框架继承了一个基类。该类具有设置标志的操作。
例如:flags |= 0x200;
在我的派生类中,我希望省略此标志设置,就好像操作flags |= 0x200从未发生过一样。
有什么方法可以实现这个目标吗?
4个回答

11

您可以使用取反符号 (~) 对所需移除的值进行逻辑非 (NOT) 操作,然后再与“与”符号 (&) 进行按位与运算:

flags &= ~0x200;
如果您的意图是确保此标志未设置。如果您想撤销对此标志的先前更改,那么如@Russell所说,异或可能是您需要的。

6

你可以使用异或(XOR)操作来去除标记。

flags ^= 0x200

这个操作还可以将该标志打开,如果它处于关闭状态。使用掩码进行异或操作的行为类似于切换开关。

2
一个XOR不行吗?flags ^ 0x200

这并没有提供问题的答案。如果您想对作者进行批评或请求澄清,请在他们的帖子下留言。 - Andro Selva
我不同意 - 我以礼貌的方式陈述,撤销这样的位运算可以使用异或操作,这也是帖子作者所询问的。 - Russell Troywest
@RussellTroywest,你的回答很有帮助!谢谢! :-) - Matthew Layton

0

如果标志的原始值已经设置了这些位,那么您很难知道它们是否已经设置。假设当您的代码执行时,标志已经是0x200,那么您的操作将不会改变任何内容,无论是异或、与还是或,都可以确保检索先前的值。我看到的一种方法是,在虚拟方法中进行此操作,并在派生类中覆盖它而不进行任何更改。另一种方法是将此魔术值设置为属性,并在派生类构造函数中将其设置为0。这将防止更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接