def test_middle_bits(self): mid_4 = BitField(4, 7) # A value that fits snugly in4 bits self.assertEqual(mid_4.insert(13, 0), 13 << 4) # A value that doesn't fit; some high bits lost self.assertEqual(mid_4.insert(21, 0), 5 << 4) # Extract unsigned self.assertEqual(mid_4.extract(15 << 4), 15) # Or convert negative numbers self.assertEqual(mid_4.extract_signed(15 << 4), -1)
def test_low_order(self): low_4 = BitField(0, 3) # A value that fits snugly in the first 4 bits self.assertEqual(low_4.insert(13, 0), 13) # A value that doesn't fit; some high bits lost self.assertEqual(low_4.insert(21, 0), 5) # Extract unsigned self.assertEqual(low_4.extract(15), 15) # Or convert negative numbers self.assertEqual(low_4.extract_signed(15), -1) # Doesn't clobber other bits higher = 15 << 4 self.assertEqual(low_4.insert(13, higher), 13 + higher) # Extraction is masked packed = low_4.insert(13, higher) self.assertEqual(low_4.extract(packed), 13)
def test_insert_neg(self): bitfield = BitField(3, 5) packed = bitfield.insert(-1, 0) self.assertEqual(packed, 0b000_111_000) unpacked = bitfield.extract_signed(packed) self.assertEqual(unpacked, -1)
def test_extract_pos(self): bitfield = BitField(2, 4) field_bits = 0b_101_011_10 # the 011 part is what we want to extract self.assertEqual(bitfield.extract_signed(field_bits), 3)