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用法,请参考: