【Java面接問題】加減乗除しない加算

3344 ワード

【タイトル】:
1つの関数を書いて、2つの整数の和を求めて、関数の体内で+、-、*、/の4つの演算記号を使用してはいけないことを要求します.
【例】:1 + 2 = 3を2進数に変換:0001 + 0010=001難点:+は使用不可
分析:
参考:進数加算減算の原理
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】:
    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
        }
    }