Git Product home page Git Product logo

bitfield's Introduction

Bitfield

A Python bitfield class for easier bit manipulation of integers

This Python class is motivated by a previous need of mine to iterate over the bits of a bitfield. My original solution was to build a bitstream generator that consumed bytes and produced bits. However, in order to accumulate bits into a bitfield for manipulation, it was easiest to use itertools.islice and convert to a tuple. This was quite inefficient.

Bitfield is a partial solution. While it still does not provide any kind of interface to consume the bits of a bitstream, it allows bitwise manipulations extremely easily.

Examples:

  • A Bitfield is an int, along with all of the operations that can be performed on an int:

    >>> from bitfield import Bitfield
    >>> bits = Bitfield(0b1010)
    >>> bin(bits)
    '0b1010'
    >>> bin(bits + 1)
    '0b1110'
    >>> bin(bits << 2)
    '0b101000'
    >>> bin(bits >> 2)
    '0b10'

    Unfortunately, ints are immutable, so any subclass of an int must also be immutable. Subclassing an int would provide the above functionality for free, without all of the nasty duplicated code I have, but would destroy one of the bigger reasons this class exists in the first place: mutability using __setitem__.

  • It is also possible to construct a Bitfield from bytes or bytearray objects:

    >>> from bitfield import Bitfield
    >>> bits = Bitfield(b'abcd')
    >>> bin(bits)
    '0b1100100011000110110001001100001'
  • A Bitfield also has a __len__ and a __getitem__, and is thus an iterable. This is the main difference between a Bitfield and an int.

    >>> from bitfield import Bitfield
    >>> bits = Bitfield(0b1010)
    >>> len(bits)
    4
    >>> list(bits)  # Equivalent to: [bit for bit in bits]
    [0, 1, 0, 1]
    >>> bits[0]  # Indexed least significant bit first
    0
    >>> bits[1]
    1
    >>> bin(bits[::-1])  # Note: bin(0b0101) will give '0b101'
    '0b101'
    >>> bin(bits[::2])  # Note: 0b00 == 0b0
    '0b0'
    >>> bin(bits[1::2])
    '0b11'
  • Unlike ints, Bitfields are mutable, and define a __setitem__:

    >>> from bitfield import Bitfield
    >>> bits = Bitfield(0b1010)
    >>> bits[0] = 1
    >>> bin(bits)
    '0b1011'
    >>> bits[::2] = 0b10  # Toggles bits 0 and 2
    >>> bin(bits)
    '0b1110'
  • Has an optional width:

    >>> from bitfield import Bitfield
    >>> bits = Bitfield(0b0101, width=4)
    >>> 0b0101.bit_length()
    3
    >>> len(bits)
    4
    >>> list(bits)
    [1, 0, 1, 0]
    >>> list(Bitfield(0b0101))
    [1, 0, 1]
  • Implements __delitem__:

    >>> from bitfield import Bitfield
    >>> bits = Bitfield(0b1001)
    >>> del bits[1:3]
    >>> bin(bits)
    '0b11'

TODO:

  • Test more extensively with negative numbers -- especially negative fixed width numbers.
  • Sphinx documentation

bitfield's People

Contributors

notgnoshi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

bitfield's Issues

hex(bitfield) throws exception if __setitem__ was given a bitfield

diff --git a/bitfield.py b/bitfield.py
index 229b473..21aa646 100644
--- a/bitfield.py
+++ b/bitfield.py
@@ -161,6 +161,8 @@ class Bitfield(object):
         '0b0'
         """
         length = len(self)
+        if isinstance(value, __class__):
+            value = value.value
         if isinstance(key, int):
             if key >= length or key < -length:
                 raise IndexError("Bitfield index out of range")
b = Bitfield(0x0, width=16)
b1 = Bitfield(0x7, width=8)
b2 = Bitfield(0xa1, width=8)
b[0:8] = b1
b[8:16] = b2

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.