code: def bitwise_not(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
docs: Unary operation: bitwise not
  
          :return: ~self