インタビューの質問は:足し算と引き算、掛け算と割り算をしません
トピック:
書き込み機能、及び+インビボ機能に必要とされない、両者の数を見つける - * / 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);
}
}
}