代码之家  ›  专栏  ›  技术社区  ›  ravelinx

有人能给我解释一下用移位乘两个变量的代码吗?[复制品]

  •  4
  • ravelinx  · 技术社区  · 6 年前

    这个问题已经有了答案:

    所以我有下面的代码,用左移位和右移位来乘两个变量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;
       }
    

    我真的试图理解代码,但我还没能理解算法。

    3 回复  |  直到 6 年前
        1
  •  4
  •   rgettman    6 年前

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

    0 1

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

    x >>>= 1; x

    y <<= 1;

        2
  •  2
  •   Bohemian    6 年前

    (x & 1) != 0

    (a + b) * y == a*y + b*y
    x * y == (x/2) * (y*2)
    

        3
  •  1
  •   gtgaxiola    6 年前

    >>>

    x x >>>= 1; 111 011

    001

    000

    iterations

    y sum

    35