code: def unpack_bitstring(length, is_float, is_signed, bits):
      # type: (int, bool, bool, typing.Any) -> typing.Union[float, int]
      
  
      if is_float:
          types = {
              32: '>f',
              64: '>d'
          }
  
          float_type = types[length]
          value, = struct.unpack(float_type, bytearray(int(''.join(b), 2)  for b in grouper(bits, 8)))
      else:
          value = int(bits, 2)
  
          if is_signed and bits[0] == '1':
              value -= (1 << len(bits))
  
      return value
docs: returns a value calculated from bits
      :param length: length of signal in bits
      :param is_float: value is float
      :param bits: value as bits (array/iterable)
      :param is_signed: value is signed
      :return: