Source code for being.bitmagic

"""Bit operation helpers. Since integers are immutable most of these do not work
in-place but return a new value instead
"""


[docs]def check_bit(value: int, bit: int) -> int: """Check n-th bit of value. Args: value: Number to check. bit: Bit number. Returns: N-th bit value Examples: >>> check_bit(0b1000, 0) 0 >>> bin(check_bit(0b1000, 3)) '0b1000' """ return value & (1 << bit)
[docs]def set_bit(value: int, bit: int) -> int: """Set n-th bit of value. Args: value: Number to set bit. bit: Bit number. Returns: Value with set n-th bit. Example: >>> bin(set_bit(0b11011, 2)) '0b11111' """ return value | (1 << bit)
[docs]def clear_bit(value: int, bit: int) -> int: """Clear n-th bit of value. Args: value: Number to clear bit. bit: Bit number. Returns: Value with cleared n-th bit Example: >>> clear_bit(0b1000, 3) 0 """ return value & ~(1 << bit)
[docs]def toggle_bit(value: int, bit: int) -> int: """Toggle n-th bit of value. Args: value: Number to toggle bit. bit: Bit number. Returns: Value with toggled n-th bit. """ return value ^ (1 << bit)
[docs]def check_bit_mask(value: int, mask: int) -> bool: """Check if all bits of mask are set in value. Args: value: Number to check. mask: Bit mask number. Returns: If mask is set in value. Examples: >>> check_bit_mask(0b1101, mask=0b1001) True >>> check_bit_mask(0b0111, mask=0b1001) False """ return (value & mask) == mask
[docs]def bit_mask(width: int) -> int: """All ones bit mask for a given width. Args: width: Width of bit mask. Returns: Bit mask. Example: >>> bin(bit_mask(width=4)) '0b1111' """ return (2 ** width) - 1