(长)乘法结果中有多少个尾零

时间:2018-11-17 23:19:39

标签: integer bit-manipulation multiplication

我想找出存在相乘结果的尾数为零。

我的乘法总是超出long范围,我发现除了使用bigint之外没有其他方法,但是我想避免这样做以提高效率。是否有一种更快的方法来查找产品的尾随零计数,而无需在BigInteger中实际进行计算?

1 个答案:

答案 0 :(得分:2)

您不需要乘法,乘法(例如,两个k位整数进入,而2k位整数出来的类型)通常具有以下属性:

tzcnt(x * y) = tzcnt(x) + tzcnt(y)

这在xy为零时会失效,在这种情况下,不管另一个操作数有多少尾随零,答案都是2k。

因此得出一个简单的算法:

  1. 如果任一输入为零,则返回2k
  2. 否则,返回tzcnt(x) + tzcnt(y)

此属性来自于部分乘积的工作方式:最低的部分乘积(对应于x中最右边的设置位)向左移y并移了x个尾随零。 ,因此此部分乘积具有tzcnt(x) + tzcnt(y)尾随零。添加其他部分乘积永远不会破坏此属性,因为它们是在较高位位置添加的。