总结一下位操作常用的几个技巧:
1.获取
判断某位是否是否为1.
bool GetBit(int num, int i)
{
return ((num & (1 << i)) != 0);
}
2.置位
将某一位置为1。
int SetBit(int num, int i)
{
return num | (1 << i);
}
3.清零
将第某几位置为0。
//第i位清零
int ClearBit(int num, int i)
{
int mask = ~(1 << i);
return num & mask;
}
//最高位至i位清零
int ClearBitsMSBthroughI(int num, int i)
{
int mask = ~((1 << i) - 1);
return num & mask;
}
//i位至0位清零
int ClearBitsIthrough0(int num, int i)
{
int mask = ~((1 << (i+1)) - 1);
return num & mask;
}
//i至j位清零(i>j)
int ClearBitsIthroughJ(int num, int i, int j)
{
int mask = ~((1 << (i+1)) - (1 << j));
return num & mask;
}
4.更新
将指定位更新为新的值。
//num的第i位更新为v
int UpdateBit(int num, int v)
{
int mask = ~(1 << i);
return (num & mask) | (v << i);
}
5.清除最低有效位
c = c & (c-1);