我的老师说如果有帮助的话是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