Если вы хотите иметь решение O (lg n), за счет возможной неоднородной вероятности, рекурсивно наполовину разделить, то есть с установленной верхней половиной битов и нижней половиной.Если оба отличны от нуля, выберите случайным образом, в противном случае выберите ненулевой.Затем половина делится на то, что осталось, и т. Д. Это займет 10 сравнений для 32-битного числа, может быть, не так мало, как хотелось бы, но лучше, чем 32.
Вы можете сохранить несколько вариантов, выбрав ислучайная верхняя или нижняя половина, и если нет попаданий, берущих другую половину, и если есть попадания, берущие половину проверенного.
Случайное число должно быть сгенерировано только один раз, поскольку вы толькоиспользуя один бит в каждом тесте, просто сдвиньте использованный бит, когда закончите.
Если у вас много битов, это будет более эффективно.Я не понимаю, как вы можете уменьшить это значение до O (1).
Например, если у вас сначала 32-битное число, а в сочетании с нулями - 0xffff0000 или 0x0000ffff, если результат ненулевойвы добавили 0xffff0000), продолжите с 0xff000000, равным 0x00ff0000, и так далее, пока не получите один бит.В итоге получается много утомительного кода.32 бита занимают 5 слоев кода.