AVX2で論理演算・シフト・ビット数の集計を高速化した固定長ビット集合です。 amd64のAVX2対応CPUとGCC/Clangが必要です。C/C++バックエンドに対応します。 initBitSet(3000) や BitSet[3000] として使います。-mavx2の指定は不要です。動的版と静的版の両方で使うAVX2カーネルです。各モジュールにincludeします。
Procs
proc `<<`[size](bitset: BitSet[size]; x: int): BitSet[size]
- 添字が大きい方向へxビットずらし、範囲外を切り捨てます。 Source Edit
proc `>>`[size](bitset: BitSet[size]; x: int): BitSet[size]
- 添字が小さい方向へxビットずらし、範囲外を切り捨てます。 Source Edit
proc `[]=`[size](bitset: var BitSet[size]; idx: Natural; x: int)
- 0ならビットを落とし、1なら立てます。それ以外は何もしません。 Source Edit
proc andpopcount[size](x, y: BitSet[size]): int
- 共通部分の要素数を、一時的な集合を作らずに返します。 Source Edit
proc initBitSet(size: static int): BitSet[size]
- 指定したビット数の空集合を構築します。 Source Edit
proc initBitSet(v: openArray[bool]; size: static int): BitSet[size] {.noinit.}
- 真偽値配列から集合を構築し、残りを0で埋めます。 Source Edit
proc initBitSetFromIndexes(indexes: openArray[int]; size: static int): BitSet[ size]
- 指定した添字のビットを立てた集合を構築します。 Source Edit
proc orpopcount[size](x, y: BitSet[size]): int
- 和集合の要素数を、一時的な集合を作らずに返します。 Source Edit
proc xorpopcount[size](x, y: BitSet[size]): int
- 対称差の要素数を、一時的な集合を作らずに返します。 Source Edit