第二版の提供を受賞 - 顔の質問65(javaの)

インタビューの質問は:足し算と引き算、掛け算と割り算をしません

トピック:

書き込み機能、及び+インビボ機能に必要とされない、両者の数を見つける - * / 4つの動作シンボルを

アイデア:

例として、5 + 17 = 22、仕上げ操作小数の最初のステップ

    メンバー①また、5 + 7 = 12、1 + 1 = 0

    ②キャリー、10ビットの最小滞在2

    ③加算結果(5 + 7 + 10 + 2 = 10 + 10に分割に対応する)10 + 10 + 2 = 22

この質問では、4つの操作だけでなく、あなただけビット演算、バイナリのビット演算を使用することができますが、それは算術の法律に基づき必要であるが、バイナリ小数に適用されます

依然として= 22 5 + 17の例としては、バイナリで、5 101,17に10001、さらに三つのステップ

    メンバー付加①:最下位ビット= 1 + 2、搬送する必要があります。第1 + 0 = 1、キャリー

    、低滞在し、1、0を運ぶ②10 + 0

    ③またキャリー10100 10の結果は、実行しない、結果は10110であります

 

方法:

ビット演算で上記の3つのステップを達成する方法を考えます

①あなたの合計

    結果1 + 0 + 0 +結果は0,0 1,1 0 + 1は、排他的論理和の結果と同等です

②キャリー

    0 + 0,1 + 0,0 + 1、それだけで1 + 1は、前方のキャリーを持って、キャリーを生成しません

    想像することができ、他方は0で、2つの数字が最初の場所や運用を行うには、2つのだけの数字が1になるように、ビットと結果が1であるときに、左側の1に移動します

③追加

    キャリーがするまで生成されなくなるまで、まだ追加のステップは、同じ②を①します

 

コード:

public class Q65 {
	public static void main(String[] args) {
		int x = 999995;
		int y = 6;
		System.out.println(sum(x,y));
	}
	
	public static int sum(int x,int y) {
		if(x==0) {return y;}
		if(y==0) {return x;}
		
		// 异或步
		int xor = x^y;
		
		// 进位步
		int flag = (x&y)<<1;
		
		// 判断是否还有进位
		// 有进位则继续将各位相加结果与进位相加
		// 无进位则返回各位相加结果
		if(flag==0) {
			return xor;
		}else {
			return sum(xor, flag);
		}
	}
}

 

おすすめ

転載: blog.csdn.net/qq_22527013/article/details/91413669