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用法