Image

Listens: Amberian Dawn — [River Of Tuoni CD01 #04] Valkyries

Categories:

Битхак

Что это?
(u ^ (u | (u-1))) + 1


UPD: Imagerenatm первым указал, что этот код (4 команды) оставляет в числе установленным только младший единичный бит, Imagedfyz вспомнил более короткий (3 команды) вариант:
u & ~(u-1)
а Imagearti_kz еще более короткий (тоже 3 команды):
u & -u

Интересно сравнить их ассемблерный код и скорость выполнения 1730000000 итераций в цикле (примерно такова тактовая частота моего процессора):

(u ^ (u | (u-1))) + 1lea 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 & -umov edx, eax
neg edx
and edx, eax
1916ms


До чего техника дошла! ©

На самом деле, конечно, компилятор частично раскрывает циклы, что позволяет процессору эффективно параллелить вычисления.