qip_iterators/
utils.rs

1/// Get the index into an Op matrix
2#[inline]
3pub fn get_flat_index(nindices: usize, i: usize, j: usize) -> usize {
4    let mat_side = 1 << nindices;
5    (i * mat_side) + j
6}
7
8/// Flips the bits in `num` from `i`th position to `(n-i)`th position.
9///
10/// # Example
11///
12/// ```
13/// use qip_iterators::utils::flip_bits;
14///
15/// assert_eq!(flip_bits(3, 0b100), 0b001);
16/// assert_eq!(flip_bits(3, 0b010), 0b010);
17/// assert_eq!(flip_bits(4, 0b1010), 0b0101);
18/// ```
19#[inline]
20pub fn flip_bits(n: usize, num: usize) -> usize {
21    let leading_zeros = 8 * std::mem::size_of::<usize>() - n;
22    num.reverse_bits() >> leading_zeros
23}
24
25/// Set the `bit_index` bit in `num` to `value`.
26///
27/// # Example
28/// ```
29/// use qip_iterators::utils::set_bit;
30/// assert_eq!(set_bit(0, 1, true), 2);
31/// assert_eq!(set_bit(1, 1, true), 3);
32/// assert_eq!(set_bit(1, 0, false), 0);
33/// ```
34#[inline]
35pub fn set_bit(num: usize, bit_index: usize, value: bool) -> usize {
36    let v = 1 << bit_index;
37    if value {
38        num | v
39    } else {
40        num & !v
41    }
42}
43
44/// Get the `bit_index` bit value from `num`.
45///
46/// # Example
47/// ```
48/// use qip_iterators::utils::get_bit;
49/// let n = get_bit(2, 1);
50/// assert_eq!(n, true);
51/// ```
52#[inline]
53pub fn get_bit(num: usize, bit_index: usize) -> bool {
54    ((num >> bit_index) & 1) != 0
55}