位运算_常见位运算总结
1.基础位运算
>>:左移一位bit位
<<:右移一位bit位
~:按位取反 0变1 1变0
&:按位与 有0为0
|:按位或 有1为1
^:按位异或 相同为0 相异为1 /无进位相加
2.给一个数n,确定它的二进制中第X位是0还是1
(n>>x)&1 (下标从0开始)
#include <iostream> using namespace std;bool checkBit(int num, int X) {return (num >> X) & 1; // 右移X位并与1进行与运算 }int main() {int num = 10; // 例子:10 的二进制是 1010int X = 1; // 要检查第1位if (checkBit(num, X)) {cout << "第" << X << "位是1" << endl;} else {cout << "第" << X << "位是0" << endl;}return 0; }
3.给一个数n,把它二进制中第X位是改为1
n | (1 << X)
#include <iostream> using namespace std;int setBit(int n, int X) {return n | (1 << X); // 设置第X位为1 }int main() {int n = 10; // 例子:10 的二进制是 1010int X = 1; // 要设置第1位为1int result = setBit(n, X);cout << "设置第" << X << "位后的结果是: " << result << endl; // 结果将是 10 | 2 = 12(1100)return 0; }
4.给一个数n,把它二进制中第X位是改为0
n & ~(1 << X)
#include <iostream> using namespace std;int clearBit(int n, int X) {return n & ~(1 << X); // 设置第X位为0 }int main() {int n = 10; // 例子:10 的二进制是 1010int X = 1; // 要设置第1位为0int result = clearBit(n, X);cout << "设置第" << X << "位后的结果是: " << result << endl; // 结果将是 10 & ~(2) = 8(1000)return 0; }
5.提取一个数n二进制最右侧的一个1
n & -n
-n对n的二进制先取反再+1
-n的二进制将最右侧的1,它的左边的区域全变反 再&导致左边全变0
6.去除一个数n二进制最右侧的一个1
n&(n-1)
(n-1)的二进制将最右侧的1,它和它的右边的区域全变反 再&导致最右侧1及它的右边全变0
7.异或运算
1.a^a=0
2.a^0=a
3.a^b^c=a^(b^c) 多个数相异或 即使运算顺序不同但值是不变的