Special Topics#

This page provides detailed information on specialized functionalities in MIMIQ.

Contents#

BitString#

The BitString class represents the state of bits and can be used to represent classical registers with specified values for each bit (0 or 1). At its core, it is simply a vector of booleans. BitString allows direct bit manipulation, bitwise operations, and conversion to other data formats like integers. It’s designed for flexibility in binary manipulation tasks within quantum computations.

Using BitString in MIMIQ Operations#

In MIMIQ, several operations use BitString as a direct input for conditional logic or specific quantum operations, such as IfStatement and Amplitude. See non-unitary operations and statistical operations pages. Here are some examples:

>>> if_statement = IfStatement(GateX(), BitString("01011"))
>>> if_statement
IF (c==01011) X

# Amplitude Operation
>>> Amplitude(BitString("001"))
Amplitude(bs"001")

Constructors#

BitString objects can be constructed in different ways.

  • From a String: Use BitString(“binary_string”) to initialize a BitString by parsing a string in binary format.

    >>> BitString("1101")
    bs"1101"
    
  • From bit locations: Use BitString(numbits, bit_indices) to initialize a BitString of numbits, setting specific bits to 1.

    # Initializing with Specific Bits
    >>> BitString(8, [2, 4, 6])
    bs"00101010"
    
  • From a function: Use BitString(f, numbits) to initialize a BitString with numbits, where each bit is set based on the function f.

    # Initialize an 8-bit BitString where bits are set based on even indices
    >>> BitString.fromfunction(8, lambda i: i % 2 == 0)
    bs"10101010"
    

Accessing and Modifying Bits#

Each bit in a BitString can be accessed or modified individually in the same way as vectors, making it easy to retrieve or set specific bit values.

# Accessing a Bit
>>> bs = BitString(4, [1, 3])
>>> bs
bs"0101"
>>> bs[2]
0

>>> # Modifying a Bit
>>> bs[2] = True
>>> bs
bs"0111"

A useful function is nonzeros(), which returns the indices of non-zero bits in a BitString.

>>> bs = BitString(6, [1, 3, 5])
>>> bs.nonzeros()
[1, 3, 5]

Conversion and Manipulation Methods#

The BitString class includes functionality for conversion to integer representations, indexing, and other methods for retrieving and manipulating bit values:

  • BitString to Integer: Use tointeger() to convert a BitString into its integer representation,

By default it uses a big-endian order.

>>> bs = BitString("101010")
>>> bs
bs"101010"

# Convert BitString to Integer (big-endian by default)
>>> bs.tointeger()
21

# Convert BitString to Integer (little-endian)
>>> bs.tointeger(endianess='little')
42

Alternatively, you can use the function toindex(), which converts a BitString to an index for purposes like vector indexing, checking bounds, and compatibility with 64-bit indexing constraints. It’s essentially the same as tointeger().

>>> bs.toindex()
21
  • BitString to String: Use to01().

    # Convert BitString to String of "0"s and "1"s (big-endian (default))
    >>> bs.to01()
    '101010'
    
    # Convert BitString to String of "0"s and "1"s (little-endian)
    >>> bs.to01(endianess='little')
    '010101'
    

Bitwise Operators#

BitString supports bitwise operations such as NOT, AND, OR, XOR, as well as bitwise shifts:

  • NOT (~):

    >>> bs = BitString("1011")
    >>> ~bs
    bs"0100"
    
  • AND (&), OR (|):

    >>> bs1 = BitString("1100")
    >>> bs2 = BitString("0110")
    
    # Bitwise AND
    >>> bs1 & bs2
    bs"0100"
    
    # Bitwise OR
    >>> bs1 | bs2
    bs"1110"
    
  • XOR (^):

    # Bitwise XOR
    >>> bs1 ^ bs2
    bs"1010"
    
  • Left Shift (<<) and Right Shift (>>):

    # Left Shift
    >>> bs << 1
    bs"0110"
    
    # Right Shift
    >>> bs >> 1
    bs"0101"
    

Concatenation and Repetition#

BitString supports concatenation and repetition, allowing you to combine or extend bitstrings efficiently:

  • Concatenation (+) Use + perator to combines two BitString objects by appending the bits of rhs to lhs.

    >>> bs1 = BitString("1010")
    >>> bs2 = BitString("0101")
    >>> bs1 + bs2
    bs"10100101"
    
  • Repetition (*) Use * perator to repeat a BitString to a specified number of times, creating a new BitString with the pattern repeated.

    >>> bs = BitString("1010")
    >>> bs * 2
    bs"10101010"