利用位运算符设置标志位

本文介绍了在编程中如何使用位运算(如按位或和按位与)管理标志位,以提高代码效率和可读性,通过`enum`和`struct`实现对文件标识符读写权限的设置。

        在写程序的过程中,会碰到需要修改标志位的情况。比如需要设置一个文件标识符可读或可写,首先想到的是利用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 标志位。

  1. 如果 flag 为真,即为 true,则执行下面代码:

    channel->event |= WriteAble;,这是一个按位或的运算符,将 channel->event 成员与 WriteAble 进行按位或操作,并将结果重新赋值给 channel->event。这实际上是将 channel->event 的 WriteAble 标志位置为 1。

  1. 如果 flag 为假,即为 false,则执行下面代码:

    channel->event = channel->event & ~WriteAble;,这里用到了按位与和按位取反的运算符。channel->event & ~WriteAble 表达式将 channel->event 的 WriteAble 标志位清零,然后将结果赋值给 channel->event

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值