位运算总结点睛

一、知识储备

移位 运算符

< <
// 示例一:
// 这里定义为 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

第260题 只出现一次的数字V3

第268题 缺失数字

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值