Вам не нужно умножать, умножать (например, когда входят два k-битных целых числа и 2k-битное целое число) обычно имеет свойство:
tzcnt(x * y) = tzcnt(x) + tzcnt(y)
Это ломается, когда x
или y
равны нулю, в этом случае ответом будет 2k независимо от того, сколько конечных нулей было у другого операнда.
Так что это приводит к простому алгоритму:
- если любой из входов равен нулю, вернуть 2k
- , в противном случае вернуть
tzcnt(x) + tzcnt(y)
Это свойство исходит из того, как работают частичные продукты:самый младший частичный продукт (соответствующий крайнему правому установленному биту в x
) сдвигается y
влево, как бы ни было много конечных нулей x
, поэтому этот частичный продукт имеет tzcnt(x) + tzcnt(y)
конечных нулей.Добавление других частичных продуктов никогда не разрушает это свойство, поскольку они добавляются в старших битовых позициях.