欢迎来到 s a y − f a l l 的文章 欢迎来到say-fall的文章 欢迎来到say−fall的文章

🌈 say-fall:个人主页 🚀 专栏:《手把手教你学会C++》 | 《C语言从零开始到精通》 | 《数据结构与算法》 | 《小游戏与项目》 💪 格言:做好你自己,才能吸引更多人,与他们共赢,这才是最好的成长方式。
前言:
在算法解题中,位运算是一类 "看似基础、实则高效" 的核心技巧 ------ 它依托二进制的底层特性,通过简单的位操作(与、或、异或、移位等),能将原本需要循环、分支实现的逻辑简化为几行代码,大幅降低时间 / 空间复杂度。
比如判断奇偶、提取二进制指定位、快速定位最右侧的 1(lowbit 操作)、利用异或的自反性解题等,都是算法题中高频出现的位运算场景。很多初学者会觉得位运算 "抽象难记",但本质上所有位运算技巧都围绕二进制的基本性质展开:移位对应乘除 2 的幂、与 / 或 / 异或对应二进制位的逻辑操作、取反 / 负数的补码特性支撑 lowbit 等核心操作。
可以将这篇文章看作是位运算解题的绪论,会系统梳理位运算的核心操作(提取末位、判断奇偶、指定位操作、lowbit/clear_lowbit、异或运算律等),拆解每个操作的底层原理与代码实现,帮你建立 "二进制思维"------ 掌握这些基础技巧后,后续面对位运算相关的算法题(如状态压缩、快速幂、找唯一数等),就能快速找到解题思路,真正做到 "化繁为简"。
文章目录
- 前言:
- 正文:
-
- [零、 几种位运算](#零、 几种位运算)
- [一、 取二进制末位](#一、 取二进制末位)
- [二、 判断奇偶](#二、 判断奇偶)
- [三、 提取 / 设置指定位](#三、 提取 / 设置指定位)
- [四、 提取/去掉二进制最右侧的1](#四、 提取/去掉二进制最右侧的1)
- 五、异或的运算律
正文:
零、 几种位运算
- 按位与&:有0为0,全真为真
- 按位或|:有1为1,全假为假
- 按位异或^:相异为一,可看作无进位相加
一、 取二进制末位
代码模板:
cpp
int main()
{
ios::sync_with_stdio(false);//关闭同步流
cin.tie(nullptr);
int n = 9;
cout << dn;
while(n > 0)
{
int a = n & 1;
cout << a << " ";
n >>= 1;
}//输出:1 0 0 1
return 0;
}
二、 判断奇偶
利用末尾 == n & 1;的性质,最后一位为1是奇数,是0为偶数
三、 提取 / 设置指定位
原理: 用按位与&提取位,按位或|设置位。
例子:
cpp
// 提取num的第k位(0表示最低位)(也称为判断第k位是0是1)
int getBit(int num, int k) {
return (num >> k) & 1; // 先右移k位,再与1提取最后一位
}
// 设置num的第k位为1
int setBit(int num, int k) {
return num | (1 << k); // 1左移k位,再与num或
}//利用移位以后第k位是1,则或运算以后一定为1.
//设置num的第k位是0
int setbit(int num, int k){
return num | (~(1 << k));//1左移k位,取反以后,再与num或
}
int main() {
int num = 5; // 0000 0101
cout << getBit(num, 2) << endl; // 提取第2位:1
cout << setBit(num, 1) << endl; // 设置第1位为1:0000 0111 → 7
return 0;
}
四、 提取/去掉二进制最右侧的1
提取二进制最右侧的1(也称lowbit操作 ),是利用 -n 会将最后一位1前面的数字都取反
提取二进制最右侧的1(这里称clear_lowbit操作 ),是利用 n-1 会将最后一位1后面的数字都取反
cpp
int lowbit(int n)
{
return n & (-n);//-n实际上是把最后一位1前面的数字都取反
}
int clear_lowbit(int n)
{
return n & (n - 1);// n-1 会将最后一位1后面的数字都取反
}
int main()
{
int n = 5;//0000 0101
std::cout << lowbit(n) << std::endl;//1
std::cout << clear_lowbit(n) << std::endl;//去掉1以后变为4
return 0;
}
五、异或的运算律
- a a a ^ a = 0 a = 0 a=0 (异或的自反性)
- a a a ^ 0 = a 0 = a 0=a
- a a a ^ ( b (b (b ^ c ) = ( a c)= (a c)=(a ^ b ) b) b) ^ c c c (交换律)
这里说一些,其实快速幂的本质也是位运算
- 本节完...