Алгоритм быстрого обнаружения - PullRequest
0 голосов
/ 18 февраля 2011

У меня есть массив из 8 элементов: Bin[8]. Бин представляет контейнер диапазона: я получаю число N, например 0 <= N <= 255.

  1. Если N < 32 ==> Bin[0] += 1
  2. Иначе, если 32 <= N < 64 ==> Bin[1] += 1
  3. ... и т. Д.

Мне нужно быстрое решение, которое не требует директивы If-Else, поскольку у меня есть несколько бинов для обработки.

Я использую Java, но решение на любом языке программирования принимается.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 18 февраля 2011

Мы можем использовать несколько побитовых операторов для этого:

binIndex = N >> 5;

Тогда

Bin[binIndex]++;

Это просто игнорирует младшие 5 битов числа, используя три старших бита (если N<= 255) как индекс в массиве бинов. </p>

2 голосов
/ 18 февраля 2011

Убедитесь, что ваше число N действительно равно 0 <= N <= 255, а затем просто: </p>

Bin[N/32]++;

Редактировать: еще один автор упомянул о смещении вправо на 5 бит.Это тоже будет работать, однако я чувствую, что деление на 32 показывает намерение чище, и любой современный компилятор оптимизирует деление на битовое смещение, если оно будет более эффективным на платформе, на которую вы в любом случае ориентируетесь.

1 голос
/ 18 февраля 2011

Просто используйте целочисленное деление (усечение):

Bin[N / 32] += 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...