def bit_by_bit(self, in_data):
        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