code: def _dichFind(self, needle, currHaystack, offset, lst = None) :
  		
  		
  		if len(currHaystack) == 1 :
  			if (offset <= (len(self) - len(needle))) and (currHaystack[0] & needle[0]) > 0 and (self[offset+len(needle)-1] & needle[-1]) > 0 :
  				found = True
  				for i in xrange(1, len(needle)-1) :
  					if self[offset + i] & needle[i] == 0 :
  						found = False
  						break
  				if found :
  					if lst is not None :
  						lst.append(offset)
  					else :
  						return offset
  				else :
  					if lst is None :
  						return -1
  		else :
  			if (offset <= (len(self) - len(needle))) :
  				if lst is not None :
  					self._dichFind(needle, currHaystack[:len(currHaystack)/2], offset, lst)
  					self._dichFind(needle, currHaystack[len(currHaystack)/2:], offset + len(currHaystack)/2, lst)
  				else :
  					v1 = self._dichFind(needle, currHaystack[:len(currHaystack)/2], offset, lst)
  					if v1 > -1 :
  						return v1
  					
  					return self._dichFind(needle, currHaystack[len(currHaystack)/2:], offset + len(currHaystack)/2, lst)
  			return -1
docs: dichotomic search, if lst is None, will return the first position found. If it's a list, will return a list of all positions in lst. returns -1 or [] if no match found