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 之后的所有 0;在第一次操作之后,每个人都会有一个跟随它。然后我们折叠两位组:现在每两个组将变为四个。然后我们弃牌四,然后弃八。然后我们拿出大锤子,十六位。

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

在这里,x++将所有 1 切换为零,使一个进位到下一列:

00100000000000000000000000000000  // after x++

一开始奇怪的递减是我们 catch<=而不是 strict <。例如,如果我们从

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

该函数mystery(x),得到一个数的下一个最高的 2 次方xx--如果数字已经是 2 的幂,则初始递减语句 ( ) 使函数返回相同的值。当接近 时,对于有符号整数的mystery(x)行为会很有趣INT_MAX_VALUE

您可以通过绘制较小值的函数值来得出这个答案x

于 2013-01-30T17:19:39.317 回答
1

该声明

x>> 1; 
  • 将二进制表示中的 x 右移 1 位,丢弃移开的位

x|= x>> 1;

  • x >> 1对with的结果执行按位或并将结果x存储在x
于 2013-01-29T05:55:57.770 回答