C++实现更改8位无符号整形的第n比特位值为1或0

value为8位无符号整形,如何更改其第n比特位的值?比如:value为243,二进制表示为:

1111 0011

如何将value更改为:

1011 0011

即在不改变其它比特位值的情况下,仅仅通过更改需要更改的比特位的值来改变value的值,如:本例中将11110011的第6位(基于0的索引,下同)的值由1改为0,其它位的值保持不变,即改为10110011。这种场景在监控类的需求中很常见:在该类需求中,有时我们获取到了原来的数据帧(包),该数据帧(包)就1个字节即8位,每位表示1个状态,需求要用最新的值更改其中的某位。如何用代码实现?

方法1:

unsigned char updateBitValue(const unsigned char& value, // 被更改的8位无符号数
                             int nBitIndex,              // 哪个bit位的需要更改
                             bool bOn                    // 更改之后的新值,true表示该bit位更改为1;反之更改为0
                            )
{
    if ((nBitIndex < 0) || (7 < nBitIndex)) // 如果bit位索引不合法,就返回自身
    {
        return value;
    }

    auto outputBitValue = bOn ? 1 : 0;

    // 取出[0, nBitIndex - 1]位的数
    auto temp1 = (1 << nBitIndex) - 1;
    auto low = (value & temp1);

    // 取出nBitIndex位的数
    auto temp2 = (1 << nBitIndex);
    auto bitValue = (value & temp2);

    // nBitIndex位新设置的数
    auto newBitValue = (outputBitValue << nBitIndex);

    // 取出[nBitIndex + 1, 8]位的数
    auto hight = value - bitValue - low;

    // 新的值
    auto newValue = hight + newBitValue + low;

    return newValue;
}

方法2:

#include<bitset>
using std::bitset;

unsigned char updateBitValue(const unsigned char& value, // 被更改的8位无符号数
                             int nBitIndex,              // 哪个bit位的需要更改
                             bool bOn                    // 更改之后的新值,true表示该bit位更改为1;反之更改为0
                             )
{
    if ((nBitIndex < 0) || (7 < nBitIndex)) // 如果bit位索引不合法,就返回自身
    {
        return value;
    }

    bitset<8> myValue = value;
    if (bOn)
    {
        myValue.set(nBitIndex);
    }
    else
    {
        myValue.reset(nBitIndex);
    }

    auto newValue = myValue.to_ullong();
    return newValue;
}

本方法采用STL的std::bitset进行操作,十分简易方便、代码简洁。关于std::bitset用法,请参考:

std::bitset用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值