Есть ли эффективный способ получить 0x00000001 или 0xFFFFFFFF для ненулевого целого числа без знака и 0 для нулевого целого без разветвления? Я хочу проверить несколько масок и создать на их основе другую маску. В принципе, я хочу, чтобы оптимизировать следующий код:Преобразование бит-бит в один бит
unsigned getMask(unsigned x, unsigned masks[4])
{
return (x & masks[0] ? 1 : 0) | (x & masks[1] ? 2 : 0) |
(x & masks[2] ? 4 : 0) | (x & masks[3] ? 8 : 0);
}
Я знаю, что некоторые оптимизирующие компиляторы могут справиться с этим, но даже если это так, то как именно они это делают? Я просмотрел страницу «Бит-скрипичные хаки», но нашел только описание условной настройки/очистки маски с использованием логического условия, поэтому преобразование из int в bool должно выполняться вне метода. Если нет общего способа решить эту проблему, как я могу эффективно это сделать с помощью ассемблера x86? Спасибо!
Но это вряд ли внеофисный. –
Я интерпретирую ветвь без здесь инструкций jmp. Сдвиг и xor-хаки, вероятно, будут медленнее. – simonzack
Спасибо! Кстати, почему вы считаете, что это вряд ли возможно? Является ли «setne» долговременной операцией? – bkxp