学习笔记——bitset笔记
位运算
一、__builtin_popcount:
__builtin_popcount(x):\(x\) 二进制里 \(1\) 的个数(unsigned int)。
__builtin_popcountll(x):(unsigned long long)
复杂度:\(O(1)\)。
二、__builtin_parity:
__builtin_parity(x):\(x\) 二进制里 \(1\) 的个数的奇偶性(如果返回 \(0\) 表示 \(x\) 二进制里 \(1\) 的个数为偶数个,否则返回 \(1\) 则表示 \(1\) 的个数为奇数个)(unsigned int)。
__builtin_parityll(x):(unsigned long long)
复杂度:\(O(1)\)。
三、__builtin_ctz:
__builtin_ctz(x):\(x\) 二进制末尾 \(0\) 的个数。
复杂度:\(O(1)\)。
四、__builtin_clz:
__builtin_clz(x):\(x\) 二进制开头 \(0\) 的个数。
\(log_2x=31-\)
__builtin_clz(x)
复杂度:\(O(1)\)。
bitset介绍
运用:bitset<N> a
a[i]:访问 \(a\) 中的第 \(i\) 项(复杂度:\(O(1)\))。a.any():判断 \(a\) 中是否存在 \(1\)(存在 \(1\) 返回 \(1\),否则返回 \(0\))(复杂度:\(O(\frac{N}{w})\),其中 \(w\) 为常数,大多时候为 \(64\))。a.none():判断 \(a\) 中是否存在 \(1\)(存在 \(1\) 返回 \(0\),否则返回 \(1\),即与a.any()相反)(复杂度:\(O(\frac{N}{w})\))。a.count():统计 \(a\) 中 \(1\) 的个数(复杂度:\(O(\frac{N}{w})\))。a.set(x):将 \(a\) 中第 \(x\) 位改为 \(1\)(即 \(a[x]=1\))。a.set():将 \(a\) 全部改为 \(1\)(复杂度:\(O(\frac{N}{w})\))。a.reset(x):将 \(a\) 中第 \(x\) 位改为 \(0\)(即 \(a[x]=0\))。a.reset():将 \(a\) 全部改为 \(0\)(复杂度:\(O(\frac{N}{w})\))。a.flip(x):将 \(a\) 中第 \(x\) 位翻转(即原本 \(0\) 变成 \(1\),原本 \(1\) 变成 \(0\),等于\(a[x]=a[x]\oplus1\) 或 \(a[x]=1-a[x]\))。a.flip():将 \(a\) 全部翻转(复杂度:\(O(\frac{N}{w})\))。
同时,多个 \(bitset\) 相互 &、|、^、~、<<、>> 等位运算的复杂度都为 \(O(\frac{N}{w})\)。

浙公网安备 33010602011771号