在写程序的过程中,会碰到需要修改标志位的情况。比如需要设置一个文件标识符可读或可写,首先想到的是利用int变量(1表示不可读不可写 ,2表示不可读可写,3表示可读不可写,4表示可读可写)。但是这样不直观,比较难记。
在计算机底层使用0、1存储,因此我们可以使用int变量进行位运算来设置标志位,比如如下依据1为是,0为否规定:
对于下面的代码示例:
enum FDevent
{
TimeOut=0x01, //001
WriteAble=0x02, //010
ReadAble=0x04 //100
};
int setWriteable(struct Channel *channel, bool flag)
{
if(flag)
{
channel->event |= WriteAble;
}
else
{
channel->event = channel->event & ~WriteAble;
}
return 0;
}
函数的目的是用来设置 struct Channel
结构体类型的 channel
对象的 event
成员的 WriteAble
标志位。
-
如果
flag
为真,即为true
,则执行下面代码:channel->event |= WriteAble;
,这是一个按位或的运算符,将channel->event
成员与WriteAble
进行按位或操作,并将结果重新赋值给channel->event
。这实际上是将channel->event
的WriteAble
标志位置为 1。
-
如果
flag
为假,即为false
,则执行下面代码:channel->event = channel->event & ~WriteAble;
,这里用到了按位与和按位取反的运算符。channel->event & ~WriteAble
表达式将channel->event
的WriteAble
标志位清零,然后将结果赋值给channel->event
。