【基础知识】
位运算
位运算(\(Bitwise Operations\))是一种直接对二进制位进行操作的运算方式。在 \(C++\) 中,位运算符包括按位与(&
)、按位或(|
)、按位异或(^
)、按位取反(~
)、左移(<<
)和右移(>>
)。这些运算符在处理二进制数据时非常有用,尤其是在需要高效处理数据或进行底层操作时。
1. 左移运算符(<<
)
逻辑:左移运算符将一个数的二进制表示向左移动指定的位数,右侧用零填充。
语法:
a << n
a
是要进行左移的数。n
是要左移的位数。
示例:
int a = 5; // 二进制表示为 0000 0101
int b = a << 2; // 左移2位,结果为 0001 0100,即十进制的 20
\(a << n\) 即为 \(a * (2^n)\)。
解释:
5
的二进制表示是0000 0101
。- 左移2位后,变为
0001 0100
,即十进制的20
。
2. 右移运算符(>>
)
逻辑:右移运算符将一个数的二进制表示向右移动指定的位数,左侧用符号位填充(对于有符号数)或用零填充(对于无符号数)。
语法:
a >> n
a
是要进行右移的数。n
是要右移的位数。
示例:
int a = 20; // 二进制表示为 0001 0100
int b = a >> 2; // 右移2位,结果为 0000 0101,即十进制的 5
\(a >> n\) 即为 \(a / (2^n)\)。
解释:
20
的二进制表示是0001 0100
。- 右移2位后,变为
0000 0101
,即十进制的5
。
3. 其他位运算符
-
按位与(
&
):对两个数的每一位进行与操作。int a = 5; // 二进制表示为 0000 0101 int b = 3; // 二进制表示为 0000 0011 int c = a & b; // 结果为 0000 0001,即十进制的 1
-
按位或(
|
):对两个数的每一位进行或操作。int a = 5; // 二进制表示为 0000 0101 int b = 3; // 二进制表示为 0000 0011 int c = a | b; // 结果为 0000 0111,即十进制的 7
-
按位异或(
^
):对两个数的每一位进行异或操作。int a = 5; // 二进制表示为 0000 0101 int b = 3; // 二进制表示为 0000 0011 int c = a ^ b; // 结果为 0000 0110,即十进制的 6
-
按位取反(
~
):对一个数的每一位进行取反操作。int a = 5; // 二进制表示为 0000 0101 int b = ~a; // 结果为 1111 1010,即十进制的 -6(在补码表示中)
应用场景
位运算在以下场景中非常有用:
- 位掩码:通过位运算来设置、清除或检查特定位。
- 高效计算:通过位运算可以实现某些高效的操作,如快速乘以或除以2的幂。
- 数据压缩:通过位运算可以实现数据的压缩和解压缩。
- 加密算法:某些加密算法中会使用到位运算。
常用思想
算法设计中常用的思想有很多,以下是一些常见的算法设计思想:
1. 分治法(Divide and Conquer)
- 思想:将问题分解为若干个规模较小的相同子问题,递归地解决这些子问题,然后将子问题的解合并得到原问题的解。
- 应用:归并排序、快速排序、二分查找、大整数乘法等。
2. 动态规划(Dynamic Programming)
- 思想:将问题分解为重叠的子问题,通过存储子问题的解来避免重复计算,从而提高效率。
- 应用:最长公共子序列、背包问题、斐波那契数列、最短路径问题等。
3. 贪心算法(Greedy Algorithm)
- 思想:在每一步选择中都采取在当前状态下最优的选择,希望通过局部最优解达到全局最优解。
- 应用:霍夫曼编码、最小生成树(Prim算法、Kruskal算法)、活动选择问题等。
4. 回溯法(Backtracking)
- 思想:通过逐步构建问题的解,并在构建过程中进行试探和回退,以找到所有可能的解。
- 应用:八皇后问题、数独、组合问题、排列问题等。
5. 分支限界法(Branch and Bound)
- 思想:类似于回溯法,但在搜索过程中通过剪枝来减少搜索空间,通常用于求解最优化问题。
- 应用:旅行商问题、背包问题、最大团问题等。
6. 递归(Recursion)
- 思想:通过将问题分解为更小的子问题,并递归地解决这些子问题,直到达到基本情况。
- 应用:阶乘计算、斐波那契数列、树的遍历等。
7. 迭代(Iteration)
- 思想:通过循环重复执行一组操作,直到满足某个条件为止。
- 应用:循环排序、矩阵乘法、迭代求解方程等。
8. 随机化(Randomization)
- 思想:在算法中引入随机性,以期望获得更好的性能或避免最坏情况。
- 应用:快速排序的随机化版本、随机化选择算法、Monte Carlo算法等。
9. 近似算法(Approximation Algorithm)
- 思想:在多项式时间内找到一个接近最优解的解,而不是最优解。
- 应用:旅行商问题的近似算法、背包问题的近似算法等。
10. 图算法(Graph Algorithms)
- 思想:专门用于处理图结构的问题,如最短路径、最小生成树、拓扑排序等。
- 应用:Dijkstra算法、Kruskal算法、Floyd-Warshall算法、拓扑排序等。
11. 线性规划(Linear Programming)
- 思想:通过线性方程和不等式来描述问题,并求解最优解。
- 应用:资源分配问题、运输问题、生产计划问题等。
12. 启发式算法(Heuristic Algorithms)
- 思想:通过启发式规则或经验来指导搜索过程,通常用于解决NP难问题。
- 应用:模拟退火、遗传算法、蚁群算法等。
13. 双指针(Two Pointers)
- 思想:使用两个指针在数组或链表中移动,以解决某些特定问题。
- 应用:两数之和、三数之和、链表中的环检测等。
14. 滑动窗口(Sliding Window)
- 思想:通过固定大小的窗口在数据结构上滑动,以解决某些连续子数组或子序列问题。
- 应用:最长无重复子串、最小覆盖子串、最大子数组和等。
15. 位运算(Bit Manipulation)
- 思想:通过操作二进制位来解决某些特定问题,通常用于优化时间和空间复杂度。
- 应用:位掩码、位计数、位翻转等。
本文来自一名初中牲,作者:To_Carpe_Diem