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)
connPtr->flags &= ~NS_CONN_ENTITYTOOLARGE;
Run Code Online (Sandbox Code Playgroud)
这并不完全"撤消",|=因为NS_CONN_ENTITYTOOLARGE如果它们已经在变量中,它可能是某些或所有位的无操作.在这些情况下,这些位也将被清除,无论它们是否在那里.
| 归档时间: |
|
| 查看次数: |
2152 次 |
| 最近记录: |