2013-11-24 4 views
3

Есть ли эффективный способ получить 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? Спасибо!

ответ

1

Обычный способ сделать это в x86 является:

test eax, eax 
setne al 
+0

Но это вряд ли внеофисный. –

+2

Я интерпретирую ветвь без здесь инструкций jmp. Сдвиг и xor-хаки, вероятно, будут медленнее. – simonzack

+0

Спасибо! Кстати, почему вы считаете, что это вряд ли возможно? Является ли «setne» долговременной операцией? – bkxp

Смежные вопросы