剣は申し出を指します-47-足し算、引き算、掛け算、割り算をしないでください-java

質問とテスト

package sword047;
/*   写一个函数,求两个整数之和,要求在函数体内不得使用+,-,x,÷四则运算符号。

*/

import java.util.List;

public class main {
	
	public static void main(String[] args) {
		int [] testTable = {1,8,21};
		int [] testTable2 = {4,9,32};
		for(int i=0;i<testTable.length;i++){
			test(testTable[i],testTable2[i]);
		}
	}
		 
	private static void test(int ito,int ito2) {
		Solution solution = new Solution();
		int rtn;
		long begin = System.currentTimeMillis();
		System.out.print(ito+"  ");
		System.out.print(ito2);
		System.out.println();
		//开始时打印数组
		
		rtn= solution.sum(ito,ito2);//执行程序
		long end = System.currentTimeMillis();	
		
		System.out.println("rtn=" );
		System.out.print(rtn);	
		System.out.println();
		System.out.println("耗时:" + (end - begin) + "ms");
		System.out.println("-------------------");
	}

}

解決策1(成功)

この質問はインタビュー中に尋ねられました。最初に、5 + 17 = 22の結果を取得する方法など、人々が小数の加算をどのように実行するかを分析しました。実際、3つのステップで進めることができます。最初のステップはEveryoneを実行することだけです。はキャリーなしで加算されます。この時点で、加算の結果は12です。2番目のステップはキャリーです。5+7にキャリーがあり、キャリーの値は10です。3番目のステップはキャリーを加算することです。前の2つの結果は12+ 10になります。結果は22で、正確に5 + 17 = 22です。

2つのツリーの合計に対する4つの算術演算は使用できないと考えていましたが、他に何を使用できますか?数値に対する4つの算術演算に加えて、ビット演算のみが残っています。ビット演算はバイナリ用なので、バイナリを使用して、前の3ステップの戦略がバイナリにも適用できるかどうかを分析しましょう。

5のバイナリ値は101、17のバイナリ値は10001です。計算を3つのステップに分割してみてください。最初のステップはキャリーをカウントせずにビットを加算することで、結果は10100です。2番目のステップはキャリーを書き留めます。この例では、キャリーは最後の桁が追加されたときにのみ生成され、結果は2進数で10になります。3番目のステップでは、最初の2つのステップの結果が追加され、結果は10110になります。これは、次の場合は正確に22です。 10進数に変換されます。3つあることがわかります。ステップバイステップの戦略は、バイナリにも適用できます。

次に、バイナリ加算をビット演算に置き換えようとします。最初のステップでは、各ビットに追加するキャリーは考慮されません。0 + 0、1 + 1の結果は0、1 +0の結果は1です。0+ 1の結果は1です。これはXORの結果と同じであることがわかりました。XORの場合、0と0、1と1のXORの結果は0であり、0と1のXOR、および1と0の結果はi1です。次に、0 + 0、0の2番目のステップビットについて考えます。 + 1、1 + 0に関する限り、キャリーはありません。1+1しかない場合、キャリーフォワードが生成されます。この時点で、最初に2つの数値がビット単位で操作され、次に1ビット前に左に移動すると想像できます。両方の数値が1の場合のみ。追加の3番目のステップは、キャリーが生成されなくなるまで前の2つのステップを繰り返すことです。

package sword047;

public class Solution {
	public int sum(int x, int y) {
		if(y==0) {
			return x;
		}
		return sum(x ^ y, (x & y) << 1);
	}
}

 

おすすめ

転載: blog.csdn.net/xushiyu1996818/article/details/112506631