部分转自:https://www.zhihu.com/question/38206659/answer/75338913
用位运算就多打括号!!!不然会炸
判断一个数字x二进制下第i位是不是等于1
1 | if ((1<<(i-1))&1) |
- 将一个数字x二进制下第i位更改成1。
1 | x = x | ( 1<<(i-1) ) |
- 把一个数字二进制下最靠右的第一个1去掉。
1 | x=x&(x-1) |
- 取二进制下的最靠右第一位(12->4)
1 | a&-a |
- 枚举时要求集合不能有两个相邻的元素
1 | if ((mask >> 1) & mask) continue; |
- 在限定必须不取某些元素的前提下枚举子集
1 | //mask的第x位为0表示x必须不在子集中(原集合中不含这个元素) |
- 在限定必须取某些元素的前提下枚举子集
1 | //mask的第x位为1表示x必须在子集中 |
位运算常用于状态压缩。