我想找出存在相乘结果的尾数为零。
我的乘法总是超出long
范围,我发现除了使用bigint之外没有其他方法,但是我想避免这样做以提高效率。是否有一种更快的方法来查找产品的尾随零计数,而无需在BigInteger中实际进行计算?
答案 0 :(得分:2)
您不需要乘法,乘法(例如,两个k位整数进入,而2k位整数出来的类型)通常具有以下属性:
tzcnt(x * y) = tzcnt(x) + tzcnt(y)
这在x
或y
为零时会失效,在这种情况下,不管另一个操作数有多少尾随零,答案都是2k。
因此得出一个简单的算法:
tzcnt(x) + tzcnt(y)
此属性来自于部分乘积的工作方式:最低的部分乘积(对应于x
中最右边的设置位)向左移y
并移了x
个尾随零。 ,因此此部分乘积具有tzcnt(x) + tzcnt(y)
尾随零。添加其他部分乘积永远不会破坏此属性,因为它们是在较高位位置添加的。