私の先生は、それが役立つならjavascriptだと言いました
function mystery(x) {
x--;
x|= x>> 1;
x|= x>> 2;
x|= x>> 4;
x|= x>> 8;
x|= x>> 16;
x++;
return x;
}
私の先生は、それが役立つならjavascriptだと言いました
function mystery(x) {
x--;
x|= x>> 1;
x|= x>> 2;
x|= x>> 4;
x|= x>> 8;
x|= x>> 16;
x++;
return x;
}
以上で最小の 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++
ステートメント
x>> 1;
x|= x>> 1;
x >> 1
withの結果に対してビットごとの OR を実行しx
、結果をx
この関数mystery(x)
は、数値の次に高い 2 の累乗を取得しx
ます。最初のデクリメント ステートメント ( x--
) は、数値が既に 2 のべき乗である場合、関数が同じ値を返すmystery(x)
ようにしますINT_MAX_VALUE
。
の小さな値の関数値をグラフ化することで、この答えを導き出すことができます。x