# BitMagic logical operations tutorial
This tutorial covers various scenarios of how operations can be programmed to achieve best performance and flexibility under different use-cases and scenarios.
- Logical operations with vectors (2-way and 3-way)
- Logical operations between a vector and a list of integers representing a set
- Logical operations between a vector and a serilaized/compressed vector
- interoperability with STL containers
- Fused operations (combinations of different logical operations or pipelines of operations).
##Use cases covered:
###OR operation (set UNION)
| `A |= B` | 2-way operation |
| `A = A | B` | 3-way operation |
| `A = A or B` | 2-way interpreter mode|
| `A = A or {serialized-BLOB)` | 2-way interpreter mode with serialized vector|
| `A |= {list of integers}` | C-style array operation |
| `A |= {STL container}` | with STL container via iterator |
| `A = (B or C or D or ...)` | variable list aggregation (UNION ALL) |
### AND operation (set intersect).
| `A &= B` | 2-way operation |
| `A = A & B` | 3-way operation |
| `A = A and B` | 2-way interpreter mode|
| `A = A and {serialized-BLOB)` | 2-way interpreter mode with serialized vector|
| `A &= {list of integers}` | C-style array operation |
| `A &= {STL container}` | with STL container via iterator |
| `A = (B and C and D and ...)` | variable list aggregation (N-way intersect) |
### XOR operation (exclusive OR)
| `A ^= B` | 2-way operation |
| `A = A ^ B` | 3-way operation |
| `A = A xor B` | 2-way interpreter mode|
| `A = A xor {serialized-BLOB)` | 2-way interpreter mode with serialized vector|
| `A ^= {STL container}` | with STL container via iterator |
|
### SUB operation (set minus / AND NOT).
| `A -= B` | 2-way operation |
| `A = A - B` | 3-way operation |
| `A = A sub B` | 2-way interpreter mode|
| `A = A sub {serialized-BLOB)` | 2-way interpreter mode with serialized vector|
| `A -= {list of integers}` | C-style array operation |
| `A -= {STL container}` | with STL container via iterator |
| `A = B sub (C or D or E or ...)` | variable list aggregation (N-way MINUS) |
### Invert
| `A = NOT A` | in-place set inverter |
### AND-OR (fused and-or)
| `A |= B & C` | 3-way operation |
| `A = A or (A and B) or (B and C) or …` | N-way AND-OR aggregation |
### AND-SUB (fused AND-MINUS)
| `T = (B and C … ) sub (D or T or … )` | N-way AND-SUB aggregation |
### AND-SUB-OR (AND-SUB with UNION ALL)
`bm::aggregator<>::pipeline<>` to run multiple AND-SUB operations on a common group of vectors for better CPU cache optimization.
| `T1 = (B and C … ) sub (D or T or … )` | step 1 |
| `T2 = (D and T) sub (C or Y or …)` | step 2|
|...| ....|
| `TN = (D and C) sub (Z or X or …)` | step N|
Results of all steps are aggregated:
`T = T1 or T2 or ... TN`