Какой алгоритм быстрее проверить, установлен ли бит? - PullRequest
7 голосов
/ 11 сентября 2011

Я создаю игру, в которой я храню много данных в одно целое или длинное число, потому что у меня будет огромное количество данных.Я не хочу использовать целые классы по соображениям производительности, и они не нужны.Я нашел два способа извлечь один бит из целого числа.Мне было интересно, если кто-нибудь знает, какой из них я должен использовать или какой из них быстрее.

Методы:

return (integer & (1 << bit)) != 0;

return (integer >> bit& 0x1) == 1;

Ответы [ 3 ]

16 голосов
/ 11 сентября 2011

Скорее всего, бит, который вы тестируете, "более постоянен", чем тот, с которым вы тестируете. Таким образом, вы можете сделать константы для бита, что означает, что вы должны сделать сдвиг только один раз. Например:

static final int LEFT_WALL = 1 << 1;
static final int RIGHT_WALL = 1 << 2;
static final int BOTTOM_WALL = 1 << 3;
static final int TOP_WALL = 1 << 4;

Тогда в вашем цикле вы просто проверяете

if ((integer & LEFT_WALL) != 0)
  // left wall collision
if ((integer & RIGHT_WALL) != 0)
  // right wall collision
...

Таким образом, вы выполняете только две операции (побитовое И и сравнение) в цикле, а не три (сдвиг, И и сравнение).

И что более важно (как указано в комментариях), чем увеличение скорости, оно также делает намного более понятным, для чего вы используете каждый бит, поэтому код легче читать.

5 голосов
/ 11 сентября 2011

Это зависит от реализации и зависит от вашего оборудования и компилятора.Без проведения каких-либо временных испытаний, я не думаю, что кто-то может сказать, что будет лучше.

Более того, я бы не стал беспокоиться о чем-то подобном, если у вас нет убедительных доказательств того, что этот код является критичным по времени.что вы должны оптимизировать его.Тратить время на микрооптимизацию кода, подобного этому, вряд ли будет продуктивно, если вы не знаете, что это узкое место в производительности, и я был бы очень удивлен, если бы вы не смогли получить еще большую бонусную производительность, оптимизируя другие части кода.Попробуйте профилировать код, чтобы увидеть, каковы настоящие узкие места, а затем оптимизировать эти части.

3 голосов
/ 11 сентября 2011

Нет почти никакой разницы.

Но единственный способ быть уверенным для вашей платформы - это профилировать их обоих.Вам нужно будет измерить время для большого числа в цикле (например, 100e6), чтобы минимизировать ошибку измерения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...