学习笔记——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})\)。

posted @ 2026-10-27 16:21  show__code  阅读(0)  评论(0)    收藏  举报