左右のシフトを使用して乗算二つの変数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;
}
私は実際にコードを理解しようとしましたが、私は、アルゴリズムのまわりで私の頭を取得することができていません。
学校から覚えている人たちのものは、どのようなアルゴリズムを覚えているだろう、2桁以上を持つ2つの数字、それぞれ乗算します:
23
x45
---
115
92x
----
1035
下のファクター内のすべての数字の場合は、トップ係数を掛け、一緒部分和を追加します。下の因子の各桁と注意どのように我々「シフト」の部分和(乗算それら10による)。
これは、同様に二進数に適用することができます。それはどちらかだから、ここで覚えておくべき事は、(係数の桁)は、乗算を必要としないことである0
(追加しない)、または1
(追加)。
101
x110
-----
000
101
101
-----
11110
それは、本質的に、このアルゴリズムが何をするかです。最下位ビットをチェックしてください。それはだ場合1
、それ以外の、他の要因(シフト)を追加追加しないでください。
ラインx >>>= 1;
右ので、次のビットダウン次のビットは、次のループ反復中に試験することができるように、最下位ビットとなるシフトします。ループの数は、最上位ビット場所に依存1
ではx
あります。最後後1
のビットがシフトアウトされx
、x
ある0
ループが終了します。
ラインは、y <<= 1;
それは、おそらく次のループ反復中に添加する準備のために他の要因(2による乗算)をシフトさせます。