部分转自:https://www.zhihu.com/question/38206659/answer/75338913

  1. 用位运算就多打括号!!!不然会炸

  2. 判断一个数字x二进制下第i位是不是等于1

1
if ((1<<(i-1))&1)
  1. 将一个数字x二进制下第i位更改成1。
1
x = x | ( 1<<(i-1) )
  1. 把一个数字二进制下最靠右的第一个1去掉。
1
x=x&(x-1)
  1. 取二进制下的最靠右第一位(12->4)
1
a&-a
  1. 枚举时要求集合不能有两个相邻的元素
1
if ((mask >> 1) & mask) continue;
  1. 在限定必须不取某些元素的前提下枚举子集
1
2
//mask的第x位为0表示x必须不在子集中(原集合中不含这个元素)
for (int mask1 = mask; mask1 >= 0; mask1 = (mask1 - 1) & mask)
  1. 在限定必须取某些元素的前提下枚举子集
1
2
//mask的第x位为1表示x必须在子集中
for (int mask1 = mask; mask1 < (1 << m); mask1 = (mask1 + 1) | mask)

位运算常用于状态压缩