前言
位运算即在比特级别进行操作的技术。使用位运算技术可以带来更快的运行速度与更小的内存使用。
一、常用位运算操作
-
测试第 k 位:s & (1 << k);
-
设置第k位:s |= (1 << k);
-
关闭第k位:s &= ~(1 << k);
-
切换第k位:s ^= (1 << k);
-
乘以2^n:s << n;
-
除以2^n:s >> n;
- a % (2^n) --> a & (2^n - 1)
-
交集:s & t;
-
并集:s | t;
-
减法:s & ~t;
-
提取最小非0位:s & (-s);
-
提取最小0位:~s & (s + 1);
-
交换值:x ^= y; y ^= x; x ^= y;
二、代码示例
//从低位到高位,取n的第m位
int getBit(int n, int m)
{
return (n >> (m-1)) & 1;
}
//从低位到高位.将n的第m位置1
int setBitToOne(int n, int m){
return n | (1 << (m-1));
/*将1左移m-1位找到第m位,得到000...1...000
n在和这个数做或运算*/
}
//从低位到高位,将n的第m位置0
int setBitToZero(int n, int m){
return n & ~(1 << (m-1));
/* 将1左移m-1位找到第m位,取反后变成111...0...1111
n再和这个数做与运算*/
}
总结
使用位运算技术可以带来更快的运行速度与更小的内存使用