Битхак
Что это?
UPD:
renatm первым указал, что этот код (4 команды) оставляет в числе установленным только младший единичный бит,
dfyz вспомнил более короткий (3 команды) вариант:
arti_kz еще более короткий (тоже 3 команды):
Интересно сравнить их ассемблерный код и скорость выполнения 1730000000 итераций в цикле (примерно такова тактовая частота моего процессора):
До чего техника дошла! ©
На самом деле, конечно, компилятор частично раскрывает циклы, что позволяет процессору эффективно параллелить вычисления.
(u ^ (u | (u-1))) + 1
UPD:
u & ~(u-1)
а u & -u
Интересно сравнить их ассемблерный код и скорость выполнения 1730000000 итераций в цикле (примерно такова тактовая частота моего процессора):
| (u ^ (u | (u-1))) + 1 | lea edx, [eax-1] or edx, eax xor edx, eax inc edx | 2953ms |
| u ^ (u | (u-1)) | lea edx, [eax-1] or edx, eax xor edx, eax | 2263ms |
| u & ~(u-1) | lea edx, [eax-1] not edx and edx, eax | 1965ms |
| u & -u | mov edx, eax neg edx and edx, eax | 1916ms |
До чего техника дошла! ©
На самом деле, конечно, компилятор частично раскрывает циклы, что позволяет процессору эффективно параллелить вычисления.