一、知识储备
移位 运算符
< <
// 示例一:
// 这里定义为 1 << nums.size() 的形式,令 n = nums.size()
// 其的十进制是 2^n ,二进制就是 第 n 位是1 ,其余为 0 的一串 二进制数,注意这里是从 0 开始数的。
memo = vector<vector<int>>(k+ 1, vector<int>(1 << nums.size(), -1));
// 示例二:
res |= backtrack(nums, state | 1 << i, k, sum + nums[i]);
> >
位求反 运算符
~
位与 运算符
&
同为1,结果为1
其余三种情况,结果为0
位或 运算符
|
同为0,结果为0
其余三种情况,结果为1
位异或 运算符
^
相同为0, 不同为1
利用异或的性质轻松解决 LC136题
x ^ x = 0 出现两次
x ^ 0 = x 出现一次
异或运算的性质
- 异或运算满足交换律和结合律
- 任意整数和自身做异或运算的结果都等于0
- 任意整数和0做异或运算的结果都等于其自身
异或(XOR)
异或运算操作符 ^
异或运算运算符 ⊕
arr[i] ⊕ arr[i+1] = encode[i] ;
arr[i+1] = arr[i] ⊕ encode[i];
_builtin_popcount()
这个函数是用来计算二进制中多少个1
int n = 8;
int res = __builtin_popcount(n);
7、++ / –
++ 在前,是先加再输出
++ 在后,是先输出再加
8、emplace_back / push_back
emplace_back 直接根据输入进行构造 contruct
push_back 先复制,然后再构造 copy-contruct
二、做题总结
1、计算幂次方
10的9次方表示方法:
- 1e9 [注意这里的是数字 1,而不是小写字母l]
- pow(10,9)
在 C++ 中的 ^ 是异或运算符
2、计算2的幂次
当一个数 n 是2的幂次时,有如下性质:
- 一定是成立的
- n 的二进制中仅包含一个 1,且是在最高位,其余全为 0
- n-1 的二进制最高位为 0,其余全为 1
- n > 0 && (n & (n - 1) )== 0 一定是成立的
- -n 是 n 的相反数,是一个负数
- n > 0 && (n & (-n) == n 一定是成立的
3、两个小技巧
- n & (n-1) 可以取出 n 的位级表示中最低的那一位
- 例如对于二进制表示11110100,减去 1 得到 11110011,这两个数按位与得到 11110000。
- 将n的二进制表示中的最低位为1的改为0
- 清除n最右边的1
- n & (-n) 可以得到 n 的位级表示中最低的那一位
- 例如对于二进制表示 11110100,取负得到 00001100,这两个数按位与得到 00000100。
- 取得n最右边的1
4、res & 1
表示取出 res 的最后一位
5、关于取余 & 同余定理
有一次遇到这个问题了,现在前缀和 LC523 的题目,后来在背包问题 LC879 也用到了这个推导
如果两个数之和除以 c 的余数 恒等于 这两个数中其中一个对 c 取余后的值 加上另一个数后在求和 再取余,也为 k。
(a+b)mod c == (a mod c + b) mod c == (a + b mod c ) mod c == k