@askogorev

Битовая операция в C++ (n < max_n, тогда n; n == max_n, тогда 0;)

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

Есть n и max_n. Можно ли как-то наложить маску или еще что, чтобы когда:
n < max_n, тогда n;
n >= max_n, тогда 0;
  • Вопрос задан
  • 3203 просмотра
Пригласить эксперта
Ответы на вопрос 5
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Например так (взял тип фиксированной ширины для простоты):

int32_t cap(int32_t n, int32_t max_n)
{
    return n & ((n - max_n) >> 31);
}
Ответ написан
Teivaz
@Teivaz
Если делать это для ускорения проверки условия, то имеет смысл когда n_max степень двойки.
тогда максимальное значение будет выглядеть, например, так:
0010 0000
Любое число, которое больше чем n_max, будет иметь единицу в одном из старших разрядов.
Тогда при наложении маски:
1110 0000
мы получим либо ноль (когда число меньше макисмального), либо некоторое значение (когда число больше или равно).
Но это не имеет особого смысла, поскольку сравнение скомпилируется в две операции (если не считать перебрасывания значений из регистра в регистр) по такту каждая: вычитание из максимального значения текущего и проверка флага отрицательности результат вычитания.
Ответ написан
xanep
@xanep
Если это в академических целях, то jcmvbkbc ответил.
Но в реальном приложении такое не стоит делать никогда. Оптимизацию нынешние компиляторы делают хорошо, даже если вы выиграете одну инструкцию, это не сделает ваше приложение быстрее. А вот нечитаемости добавит ого-го как.
Ответ написан
Trrrrr
@Trrrrr
Главная идея простая:
пусть есть
if (a < b) 
{
x = f(1); 
}
else
{
x = f(2);
}

это можно заменить так:
f1 = f(1);
f2 = f(2);
mask = (a < b) * 0xFFFFFFFF;/// это просто упрощенный пример, что бы вернуть или 0 или 0xFFFFFFFF

//тогда 
x = (mask & f1) | (~mask & f2);


Если f1 и f2 вычисляются быстро, то получаем выгоду за счет конвейерной архитектуры процессора. Так как условный переход у нас исчезает. Но если f - тяжелая функция, то скорее всего будет намного быстрее проверить иф и посчитать только один из вариантов.

Правда чаще всего такое делал работая с SSE2.
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
один вопрос... зачем? это решается тернальным оператором, и никаких извращений... или же функции вроде max/min.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы