Unary operation: bitwise not

        :return: ~self

def bitwise_not(self):
        """
        Unary operation: bitwise not

        :return: ~self
        """
        splitted_si = self._ssplit()
        if len(splitted_si) == 0:
            return StridedInterval.empty(self.bits)

        result_interval = list()
        for si in splitted_si:
            lb = ~si.upper_bound
            ub = ~si.lower_bound
            stride = self.stride

            tmp = StridedInterval(bits=self.bits, stride=stride, lower_bound=lb, upper_bound=ub)
            result_interval.append(tmp)

        si = StridedInterval.least_upper_bound(*result_interval).normalize()
        # preserve the uninitialized flag
        si.uninitialized = self.uninitialized
        return si