位运算底层逻辑与解题应用绪论

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

🌈 say-fall:个人主页 🚀 专栏:《手把手教你学会C++》 | 《C语言从零开始到精通》 | 《数据结构与算法》 | 《小游戏与项目》 💪 格言:做好你自己,才能吸引更多人,与他们共赢,这才是最好的成长方式。


前言:

在算法解题中,位运算是一类 "看似基础、实则高效" 的核心技巧 ------ 它依托二进制的底层特性,通过简单的位操作(与、或、异或、移位等),能将原本需要循环、分支实现的逻辑简化为几行代码,大幅降低时间 / 空间复杂度。

比如判断奇偶、提取二进制指定位、快速定位最右侧的 1(lowbit 操作)、利用异或的自反性解题等,都是算法题中高频出现的位运算场景。很多初学者会觉得位运算 "抽象难记",但本质上所有位运算技巧都围绕二进制的基本性质展开:移位对应乘除 2 的幂、与 / 或 / 异或对应二进制位的逻辑操作、取反 / 负数的补码特性支撑 lowbit 等核心操作。

可以将这篇文章看作是位运算解题的绪论,会系统梳理位运算的核心操作(提取末位、判断奇偶、指定位操作、lowbit/clear_lowbit、异或运算律等),拆解每个操作的底层原理与代码实现,帮你建立 "二进制思维"------ 掌握这些基础技巧后,后续面对位运算相关的算法题(如状态压缩、快速幂、找唯一数等),就能快速找到解题思路,真正做到 "化繁为简"。


文章目录

  • 前言:
  • 正文:
    • [零、 几种位运算](#零、 几种位运算)
    • [一、 取二进制末位](#一、 取二进制末位)
    • [二、 判断奇偶](#二、 判断奇偶)
    • [三、 提取 / 设置指定位](#三、 提取 / 设置指定位)
    • [四、 提取/去掉二进制最右侧的1](#四、 提取/去掉二进制最右侧的1)
    • 五、异或的运算律

正文:

零、 几种位运算

  1. 按位与&:有0为0,全真为真
  2. 按位或|:有1为1,全假为假
  3. 按位异或^:相异为一,可看作无进位相加

一、 取二进制末位

代码模板:

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;
}

五、异或的运算律

  1. a a a ^ a = 0 a = 0 a=0 (异或的自反性)
  2. a a a ^ 0 = a 0 = a 0=a
  3. a a a ^ ( b (b (b ^ c ) = ( a c)= (a c)=(a ^ b ) b) b) ^ c c c (交换律)

这里说一些,其实快速幂的本质也是位运算


  • 本节完...
相关推荐
臭东西的学习笔记2 小时前
第二周——酶工程学习进展
学习
Σίσυφος19002 小时前
为什么 Generalized ICP(GICP)通常比 Point-to-Plane 更稳定?
算法
Editor_li2 小时前
营销界期刊杂志投稿发表
论文阅读·学习
cui_ruicheng2 小时前
C++关联容器进阶:unordered_map / set与详解
开发语言·c++
恒者走天下2 小时前
qt就业岗位都有哪些,具体分布在什么类型的公司
c++
cicada152 小时前
MFC中的DoDataExchange表示什么功能?
c++·mfc
Dxy12393102162 小时前
PyTorch的自定义学习率调度器详细介绍
人工智能·pytorch·学习
j_xxx404_2 小时前
常见位运算基础知识,技巧总结以及力扣实战
数据结构·c++·算法·leetcode
sycmancia2 小时前
C++——C++异常处理
开发语言·c++