[アルゴリズム]ビット演算による加算
687 ワード
最近また会って、固めています.
結合前:
[アルゴリズム]mask=k&(-k)、バイナリ10進数、ビット演算
同等:
https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/
1つの関数を書いて、2つの整数の和を求めて、関数の体内で“+”、“-”、“*”、“/”の4つの演算記号を使用してはいけないことを要求します.
異和演算は、進位なし和に相当するため、2つの数字が異なるだけで1になります.
席は?
キャリーは演算+左シフトに相当します.
演算と同時に1の場合が1なので、1桁左に移動することで、キャリー効果が得られます.
結果は、異或演算結果nであるべきである
c : a&b<<1
では、ループのボールnとcは進位が0になるまで;このときs=n
実は最終的に加算もするので、異や進位を繰り返すといいですね~
結合前:
[アルゴリズム]mask=k&(-k)、バイナリ10進数、ビット演算
同等:
https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/
1つの関数を書いて、2つの整数の和を求めて、関数の体内で“+”、“-”、“*”、“/”の4つの演算記号を使用してはいけないことを要求します.
異和演算は、進位なし和に相当するため、2つの数字が異なるだけで1になります.
席は?
キャリーは演算+左シフトに相当します.
演算と同時に1の場合が1なので、1桁左に移動することで、キャリー効果が得られます.
結果は、異或演算結果nであるべきである
c : a&b<<1
では、ループのボールnとcは進位が0になるまで;このときs=n
実は最終的に加算もするので、異や進位を繰り返すといいですね~
public int add(int a, int b) {
while(b != 0) {
int c = (a & b) << 1;
a ^= b;
b = c;
}
return a;
}