java - 有人可以向我解释这段使用移位将两个变量相乘的代码吗?

标签 java algorithm multiplication

<分区>

所以我有以下代码使用左右移位将两个变量 x 和 y 相乘。

class Multiply {

    public static long multiply(long x,long  y) {
        long sum = 0;
        while(x != 0) {
            if((x & 1) != 0) {
                sum = sum+y;
            }
            x >>>= 1;
            y <<= 1;
        }
        return sum;
    }

    public static void main(String args[]) {
        long x = 7;
        long y = 5;
        long z = multiply(x,y);
    }
}

但是我不明白它背后的逻辑,我明白当你这样做的时候

y<<=1

你在加倍 y,但是 while 循环的迭代次数取决于 x 的位数是什么意思?

while(x != 0) 

另外,为什么我只在 x 的最右边位是 1 时才求和?

   if((x & 1) != 0) {
      sum = sum+y;
   }

我真的很努力去理解代码,但我一直没能理解算法。

最佳答案

我们这些在学校记得如何将两个数字相乘的人,每个数字都有两位或更多数字,会记住算法:

  23
 x45
 ---
 115
 92x
----
1035

对于底部因子中的每个数字,将其乘以顶部因子并将部分和加在一起。请注意我们如何“移动”部分和(将它们乘以 10)与底部因子的每个数字。

这也适用于二进制数。这里要记住的是不需要乘法(乘以一个因子的数字),因为它要么是 0。 (不要添加)或 1 (添加)。

  101
 x110
-----
  000
 101
101
-----
11110

这基本上就是该算法的作用。检查最低有效位;如果它是 1 , 添加另一个因素(移位),否则不添加。

x >>>= 1;右移使下一位成为最低有效位,以便在下一次循环迭代期间可以测试下一位。循环次数取决于最高有效位的位置 1x是。最后1之后位移出 x , x0循环终止。

y <<= 1;移动另一个因子(乘以 2)以准备在下一次循环迭代期间可能添加它。

关于java - 有人可以向我解释这段使用移位将两个变量相乘的代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51643663/

相关文章:

java - Android应用登录注册报错

java - 加载远程 Java 类

c++ - 如何生成用于测试快速排序最佳案例的数组?

用于文件 AES 加密/解密的 Java 类

java - 递归检查数组是否包含 0 (java)

Ruby - 乘法问题

C++ 并行矩阵乘法,计算不正确

javascript - 如何在另一个文件中使用js变量

c - OpenCL 在没有输入数据或使用 3 维的情况下执行

algorithm - 将后序二叉树遍历索引转换为层序(广度优先)索引