我的老师说如果有帮助的话是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 之后的所有 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++
该函数mystery(x)
,得到一个数的下一个最高的 2 次方x
。x--
如果数字已经是 2 的幂,则初始递减语句 ( ) 使函数返回相同的值。当接近 时,对于有符号整数的mystery(x)
行为会很有趣INT_MAX_VALUE
。
您可以通过绘制较小值的函数值来得出这个答案x
该声明
x>> 1;
x|= x>> 1;
x >> 1
对with的结果执行按位或并将结果x
存储在x