5

最近、このインタビューの質問に出くわしましたが、ビット操作が苦手です。関数「f」が何をするのか説明できますか。この再帰関数が何をするのかわかりません。

unsigned int f (unsigned int a , unsigned int b)
{
   return a ?   f ( (a&b) << 1, a ^b) : b;
}

ロジックをテストするために Visual Studio にコードを貼り付けようとしましたが、コンパイラがエラー メッセージをスローしています。インタビューの質問は上記とまったく同じだったと思います

4

2 に答える 2

4

これについて言及しているコメントの中で、すでに数人が 2 つの数字を追加するだけです。いくつかの入力を試して結果を記録するよりも、それを理解するためのより良い方法がわかりません。

元:

f(5,1) --> returns f(2,4) --> returns f(0,6) --> returns 6

 1.) 5&1 = 1 bit shifted = 2:  5^1 = 4
 2.) 2&4 = 0 bit shifted = 0:  2^4 = 6
 3.) a = 0 so return b of 6

f(4,3) --> returns f(0,7) --> returns 7

1.) 4&3 = 0 bit shifted = 0:  4^3 = 7
2.) a = 0 so return b of 7

出力の例をいくつか示した後、f が 2 つの入力を加算して返すと仮定できると思います。

于 2013-11-01T21:25:43.453 に答える
0

将来の雇用主は非常に徹底しているか、残酷で異常な罰を楽しんでいます。

質問への答えとして、HackersDelightから無料で入手できる第 2 章のレビューは、金の価値があります。関数内の加算演算子は、HAKMEM メモ (項目 23 ) から取得され、2 を掛ける代わりに左シフトを代用します。元の HAKMEM メモでは次のように提案されています。

(A AND B) + (A OR B) = A + B = (A XOR B) + 2 (A AND B)

またはCで書き直しました:

x + y = (x ^ y) + 2 * (x & y)

創造的な雇用主は(x & y) << 1、代わりにと 再帰を使用して合計ととまで2 * (x & y)計算し、その時点で=が返されます。or aba0b

私のインタビューじゃなくてよかった。

于 2014-07-02T00:33:40.160 に答える