бинарная проверка операции - PullRequest
0 голосов
/ 28 февраля 2019

Предположим, что в классе есть n студентов, которые должны сдать экзамен.
Мы намерены разработать самый быстрый способ выяснить, все ли студенты сдали экзамен.
Поскольку состояние хранится в репозитории, прочитайте иоперация обновления стоит дорого.
Возможно ли это из-за сдвига / переключения битов?
Если n = 5, начальное состояние составляет n байтов 0 - 00000
Каждый учащийся, сдающий экзамен, нажимает 1, начиная справо.

 00001
 00011
 00111

......

Все байты, состоящие из 1, указывают на закрытие.
Как нам этого добиться, используя битовые операции?
Есть ли более эффективный способ добиться этого?

1 Ответ

0 голосов
/ 28 февраля 2019

У вас уже есть все шаги:

n биты из 0:

status = 0

Каждый студент, заканчивающий экзаменнажимает 1, начиная справа.

status = status << 1  # push previous to left
status = status | 1    # set the lowest bit

Все байты, состоящие из 1, указывают на закрытие.

allOnes = (1<<num_students) -1
closure = (status == allOnes)

Есть ли более эффективныйспособ достижения этого?

@ Комментарий Алена верен: метод, который вы описываете, является просто менее эффективным способом подсчета от 1 до n.Почему бы вместо этого не использовать простой счетчик?

takers +=1
completed = (takers == num_students)

Для хранения данных потребуется lg (n) бит вместо n бит.В любом случае будет цикл загрузки / изменения / тестирования / сохранения для каждого получателя, поэтому существенной экономии времени не будет.Единственная причина, по которой я мог бы использовать битовое поле, заключается в том, что вы обеспокоены тем, что один человек может сдать тест дважды и сбросить счет.

...