在C中如何"反转"此运算符| =

Tro*_*ame 2 c bit-manipulation

我是C语言编程的新手,我有以下情况,我知道需要做什么,我只是不确定正确的方法.我会尽量保持简单,如果我没有提供足够的信息,请告诉我.

这行有一个.h文件:

#define NS_CONN_ENTITYTOOLARGE    0x2000
Run Code Online (Sandbox Code Playgroud)

然后在C代码中我们设置了以下标志:

connPtr->flags |= NS_CONN_ENTITYTOOLARGE;
Run Code Online (Sandbox Code Playgroud)

然后在这个测试中:

if (connPtr->flags & NS_CONN_ENTITYTOOLARGE) {
}
Run Code Online (Sandbox Code Playgroud)

现在我想做的是基本上"撤消"旗帜NS_CONN_ENTITYTOOLARGE.经过一些谷歌搜索,我发现这|=是一个"按位OR",但在得知之后我感觉不那么开明.我需要做一个按位XOR,一个NOT还是什么?

以下是我可以在头文件中找到的标志的所有可能值.

#define NS_CONN_CLOSED        0x1
#define NS_CONN_SKIPHDRS      0x2
#define NS_CONN_SKIPBODY      0x4
#define NS_CONN_READHDRS      0x8
#define NS_CONN_SENTHDRS      0x10
#define NS_CONN_KEEPALIVE     0x20
#define NS_CONN_WRITE_ENCODED     0x40
#define NS_CONN_FILECONTENT       0x80
#define NS_CONN_RUNNING           0x100
#define NS_CONN_OVERFLOW      0x200
#define NS_CONN_TIMEOUT           0x400
#define NS_CONN_GZIP          0x800
#define NS_CONN_CHUNK         0x1000
#define NS_CONN_ENTITYTOOLARGE    0x2000
Run Code Online (Sandbox Code Playgroud)

orl*_*rlp 13

您无法将OR反转为先前的值.信息丢失了,请考虑这个真值表:

A|B|OR
------
0|0|0
0|1|1
1|0|1
1|1|1
Run Code Online (Sandbox Code Playgroud)

如您所见,信息丢失是因为A为0或1时没有明确的值.

您想知道的是如何删除标志.这可以通过与标志的倒数进行AND运算来完成:

connPtr->flags &= ~NS_CONN_ENTITYTOOLARGE; 
Run Code Online (Sandbox Code Playgroud)


Art*_*cto 8

connPtr->flags &= ~NS_CONN_ENTITYTOOLARGE;
Run Code Online (Sandbox Code Playgroud)

这并不完全"撤消",|=因为NS_CONN_ENTITYTOOLARGE如果它们已经在变量中,它可能是某些或所有位的无操作.在这些情况下,这些位也将被清除,无论它们是否在那里.

  • @Brian Fenton - 如果变量`connPtr-> flags`中与`NS_CONN_ENTITYTOOLARGE`中定义的位相对应的所有位在执行`| =`行之前已经设置好,那么实际上什么都没做(无操作)或没有操作).在这种情况下,`&= ~`将清除`NS_CONN_ENTITYTOOLARGE`中定义的位,这些位使`connPtr-> flags`的值不同于原来的值.当然,这不是"撤消". (2认同)