【Java面接問題】加減乗除しない加算
3344 ワード
【タイトル】:
1つの関数を書いて、2つの整数の和を求めて、関数の体内で+、-、*、/の4つの演算記号を使用してはいけないことを要求します.
【例】:
分析:
参考:進数加算減算の原理
10進数加算では、次の3つのステップに分けられます.進位を無視し、対応する各数字のみを加算して12(個位上5+7=12、進位を無視した結果2); はキャリーを記録し、前の計算では1桁の数字だけがキャリー1を加算し、キャリー値は10であった. は、ステップ1の方法に従って、ステップ1の結果にキャリー値を加算し、最終結果22を得る.
次に、2進数の場合(5=101、17=10001)を考慮すると、3段階に分けられる.進位を無視し、各数字に対応して加算し、10100を得る. はキャリーを記録するが、本例では最後のビットが加算されたときのみキャリー1が生成する、キャリー値は10(バイナリ)である; .は、ステップ1の方法に従って、ステップ1の結果にキャリー値を加算し、最終結果10110を得、ちょうど10進数22のバイナリ表現である.
次に、上記のバイナリ加算3ステップ計算法をビット演算で置き換えます.
ステップ1(進位を無視):0+0=0、0+1=1、1+0=0、1+1=0、典型的な異或演算.ステップ2:明らかに、1+1だけ前に進位1が生成され、この数に対する進位値は10であり、10=(1&1)<1である.ステップ3:ステップ1とステップ2で得られた結果を加算し、実際には、ステップ2が生成されなくなるまで繰り返します.
【キー】:進変換
【Java】:
1つの関数を書いて、2つの整数の和を求めて、関数の体内で+、-、*、/の4つの演算記号を使用してはいけないことを要求します.
【例】:
1 + 2 = 3
を2進数に変換:0001 +
0010=001難点:+
は使用不可分析:
参考:進数加算減算の原理
10進数加算では、次の3つのステップに分けられます.
次に、2進数の場合(5=101、17=10001)を考慮すると、3段階に分けられる.
次に、上記のバイナリ加算3ステップ計算法をビット演算で置き換えます.
ステップ1(進位を無視):0+0=0、0+1=1、1+0=0、1+1=0、典型的な異或演算.ステップ2:明らかに、1+1だけ前に進位1が生成され、この数に対する進位値は10であり、10=(1&1)<1である.ステップ3:ステップ1とステップ2で得られた結果を加算し、実際には、ステップ2が生成されなくなるまで繰り返します.
【キー】:進変換
【Java】:
public class Solution {
// num1 1(0001),num2 2(0010)
public int Add(int num1,int num2) {
int num3;// ,
int num4;//
do{
num3=num1^num2;// ( ):0011=3
num4=(num1&num2)<<1;// ( 1 1):0000=0, :0000=0
num1=num3;
num2=num4;
}while(num4!=0);//
//
return (num1|num2);// ( 1 1):0011+0000=3+0=3
}
}