Иногда вы можете заменить битовые операции логическими операциями.Например, следующий код:
if ((a < 0) && (b < 0)
{
do something
{
В C это может быть заменено на:
if ((a & b) < 0)
{
do something
{
Это работает, потому что один бит в целом числе используется как бит знака (1 указываетотрицательный).Операция and (a & b) будет бессмысленным числом, но ее знак будет побитовым и со знаками чисел, и, следовательно, проверка знака результата будет работать.
Это может или не можетулучшение производительности.Выполнение двух булевых тестов / веток будет хуже на ряде архитектур и компиляторов.Современные компиляторы x86, вероятно, могут генерировать одну ветвь, используя некоторые более новые инструкции, даже с обычным синтаксисом.
Как всегда, если это приводит к увеличению производительности ... Прокомментируйте код - т.е. поместите "нормальный "способ сделать это в комментарии и сказать, что это эквивалентно, но быстрее.
Аналогично, ~ |и ^ можно использовать аналогичным образом, если все условия (x <0).Для условий сравнения вы обычно можете использовать вычитание: </p>
if ((a < b) | (b < c))
{
}
становится:
if (((a-b) | (b-c)) < 0)
{
}
, потому что ab будет отрицательным, только если a меньше b.С этим могут быть проблемы, если вы получаете в пределах 2 от max int - т.е. арифметическое переполнение, поэтому будьте осторожны.
В некоторых случаях это допустимые оптимизации, но в остальном они совершенно бесполезны.И, чтобы казаться действительно уродливыми, числа с плавающей запятой также имеют знаковые биты ...; -)
ПРИМЕР: В качестве примера, скажем, вы хотите предпринять действия в зависимости от порядка a, b, c.Вы можете сделать некоторые вложенные конструкции if / else, или вы можете сделать это:
x = ((a < b) << 2) | ((b < c) << 1) | (c < a);
switch (x):
Я использовал это в коде с 9 условиями, а также использовал упомянутые выше вычитания с дополнительной логикой, чтобы изолировать знакбиты вместо менее чем.Это быстрее, чем эквивалент ветвления.Однако вам больше не нужно выполнять вычитание и извлечение знаковых битов, потому что стандарт давно обновлен, и в нем задано значение true, равное 1, а с условными перемещениями и т. Д. Фактическое значение «меньше» может быть весьма эффективным в наши дни.