是否可以在一条语句中执行两个相反的位操作? 我在C++和一个完整的NeWB上有点新的操作(我只知道基本知识),我正在研究一个项目,我需要保持文档在位字段中的状态。

是否可以在一条语句中执行两个相反的位操作? 我在C++和一个完整的NeWB上有点新的操作(我只知道基本知识),我正在研究一个项目,我需要保持文档在位字段中的状态。,c++,bit-manipulation,bitwise-operators,C++,Bit Manipulation,Bitwise Operators,简而言之:我希望在无条件删除flag2的同时保留flag1的最后状态。 我现在的情况是这样的: bitfield |= flag1; bitfield &= ~flag2; bitfield ^= (flag1|flag2) 位字段|=flag1;位字段&=~flag2; 问题是:有没有一种方法可以在一个语句中实现这一点 在我的情况下,我不能像这样切换它们: bitfield |= flag1; bitfield &= ~flag2; bitfield ^= (flag1|flag2) 位字段^

简而言之:我希望在无条件删除flag2的同时保留flag1的最后状态。 我现在的情况是这样的:

bitfield |= flag1; bitfield &= ~flag2; bitfield ^= (flag1|flag2) 位字段|=flag1;位字段&=~flag2; 问题是:有没有一种方法可以在一个语句中实现这一点

在我的情况下,我不能像这样切换它们:

bitfield |= flag1; bitfield &= ~flag2; bitfield ^= (flag1|flag2) 位字段^=(flag1 | flag2) 这是我想到的显而易见的答案,但问题是flag1有时设置了,有时没有设置,我想保留它,因为我在删除flag2时从上次函数调用收到它

谢谢你的帮助

你当然可以

 bitfield = (bitfield | flag1) & ~flag2;
你可以使用


如果反转flag1或flag2的定义,则可以。在第一个语句之后,flag1总是被设置的,所以当你说它只是有时被设置时,我很困惑。如果这对指令的目标只是删除flag2,同时保留flag1的状态,那么只需省略第一条语句;
&
语句已保留flag1。这是假设flag1和flag2不重叠。您的文本与代码不匹配,或者Rob说您忽略了一些假设。“在无条件删除flag2的同时保留flag1的最后状态”意味着flag2没有要清除flag1必须设置的位,或者您的代码可以很明显地清除它们。首先清除flag2位,然后再次设置flag1位;这将保留它们。无论您在一条或两条语句中执行此操作,它们都可能导致相同的程序集输出。保持它的简单明了,让优化器加快。好的,很抱歉误解,但是是的,在我的代码的其他部分中设置/删除了flag1。包含标志的变量是静态的,因此我接收的位字段中已经设置/删除了一些位。I
标记1以保留它,然后继续删除标记2。我从来没有说过这是错误的,我只是想知道是否有可能在一个声明中做到这一点。下面答案的第一部分就是我想要的。你说“很明显”,但从来没有想到分组的顺序会影响结果。。。我甚至尝试过类似于
bitfield |=(flag1 | flag2)和~flag2
的方法,但从未想过使用位字段本身>,这是显而易见的,因为它只是重写语句,而不是特定于位字段。您可以用
+
替换
|
,用
*
替换
&
,重写仍然有效。