0

私の先生は、それが役立つならjavascriptだと言いました

function mystery(x) { 
  x--; 
  x|= x>> 1; 
  x|= x>> 2; 
  x|= x>> 4;
  x|= x>> 8; 
  x|= x>> 16; 
  x++; 
  return x; 
}
4

3 に答える 3

3

以上で最小の 2 の累乗を見つけxます。代わりに、以降x--のすべては、 にあるすべてのものの残りの最下位ビットを見つけますx-1

たとえばx - 1

00010100111010100001010011101010

その後mystery(x)になります

00100000000000000000000000000000

最初に、1 を右に折りたたむことによって、1 に続くすべてのゼロを埋めます。最初の操作の後、すべての人に次の操作があります。次に、2 ビットのグループを折りたたみます。2 つのグループはすべて 4 になります。次に、4 つ折り、次に 8 つ折ります。それから、16 ビットの大きなハンマーを取り出します。

00010100111010100001000000001100  // x - 1
00011110111111110001100000001110  // after folding one bit
00011111111111111101111000001111  // after 2
00011111111111111111111111101111  // after 4
00011111111111111111111111111111  // after 8, and every step thereafter

ここでは、x++すべての 1 を 0 に切り替えて、次の列に 1 つキャリーします。

00100000000000000000000000000000  // after x++

最初の奇妙なデクリメントは、<=strict の代わりにcatch するため<です。たとえば、

00000000000000000000000000000100  // x
00000000000000000000000000000011  // after x--
00000000000000000000000000000011  // after folding, unchanged - they're all ones anyway
00000000000000000000000000000100  // after x++
于 2013-01-29T06:03:15.593 に答える
1

ステートメント

x>> 1; 
  • バイナリ表現の x を 1 ビット右にシフトし、シフトされたビットを破棄します。

x|= x>> 1;

  • x >> 1withの結果に対してビットごとの OR を実行しx、結果をx
于 2013-01-29T05:55:57.770 に答える
1

この関数mystery(x)は、数値の次に高い 2 の累乗を取得しxます。最初のデクリメント ステートメント ( x--) は、数値が既に 2 のべき乗である場合、関数が同じ値を返すmystery(x)ようにしますINT_MAX_VALUE

の小さな値の関数値をグラフ化することで、この答えを導き出すことができます。x

于 2013-01-30T17:19:39.317 に答える