code: def bit_by_bit(self, in_data):
          
          # If the input data is a string, convert to bytes.
          if isinstance(in_data, str):
              in_data = [ord(c) for c in in_data]
  
          register = self.NonDirectInit
          for octet in in_data:
              if self.ReflectIn:
                  octet = self.reflect(octet, 8)
              for i in range(8):
                  topbit = register & self.MSB_Mask
                  register = ((register << 1) & self.Mask) | ((octet >> (7 - i)) & 0x01)
                  if topbit:
                      register ^= self.Poly
  
          for i in range(self.Width):
              topbit = register & self.MSB_Mask
              register = ((register << 1) & self.Mask)
              if topbit:
                  register ^= self.Poly
  
          if self.ReflectOut:
              register = self.reflect(register, self.Width)
          return register ^ self.XorOut
docs: Classic simple and slow CRC implementation.  This function iterates bit
          by bit over the augmented input message and returns the calculated CRC
          value at the end.