位操作是程序设计中对位模式或二进制数的一元和二元操作。在许多古老的微处理器上,位运算比加减运算略快,通常位运算比乘除法运算要快很多。在现代架构中,情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算)。 (Wikipedia)
分类
&
按位与
如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
|
按位或
两个相应的二进制位中只要有一个为1,该位的结果值为1
^
按位异或
若参加运算的两个二进制位值相同则为0,否则为1
~
取反
~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1
<<
左移
用来将一个数的各二进制位全部左移N位,右补0
>>
右移
将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数, 高位补0
性质
0^x = x;
^ 满足交换和结合律
x^x = 0;
举栗
- 验证一个数的奇偶
- 统计二进制中1的个数
- 汉明距离(统计两个二进制数中相同为不同值的位数)
- 看一个数是否是2的幂(4的幂)
- 出现次数是奇数次的数的异或
- 快速求幂(数值快速幂 矩阵快速幂)
- 状压dp
例题
没有交集的单词
https://leetcode-cn.com/problems/maximum-product-of-word-lengths/
快速幂解释:例如
dp介绍
基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解
爬楼梯
https://leetcode-cn.com/problems/climbing-stairs/
状压dp
http://www.bnuoj.com/problem_show.php?pid=12976
STL
C++ STL(标准模板库)是一套功能强大的 C++ 模板类
东西太多了,只能介绍一小部分,大家有时间进一步学习吧
容器
- vector 变长数组
- set 集合 可以用来去重
- map 映射
- string 字符串类 丰富的字符串操作函数
- list 链表
库函数
sort 可以自定义排序依据,用来排结构体
next_permutation 返回下一个排列
prev_permutation 返回上一个排列
make_heap 建立堆 最大最小堆看传入的函数
https://leetcode-cn.com/problems/two-sum/
枚举
双指针
哈希
强大的map
https://leetcode-cn.com/problems/group-anagrams/
map是怎么实现的?
哈希