[英]Could anyone please explain what the following code does and HOW it works?
我的老师说这是javascript,如果有帮助
function mystery(x) {
x--;
x|= x>> 1;
x|= x>> 2;
x|= x>> 4;
x|= x>> 8;
x|= x>> 16;
x++;
return x;
}
它找到两个大于或等于x
的最低幂。 或者, x--
之后的所有内容都将找到x-1
中所有内容中剩下的最低位。
例如,如果您有x - 1
作为
00010100111010100001010011101010
那么mystery(x)
将是
00100000000000000000000000000000
它首先将右边的零折叠起来,以填充一个后跟的所有零。 第一次操作后,每个人都会跟随一个。 然后,我们折叠两位的组:现在每两个将变为四个。 然后我们折四折,然后八折。 然后,我们取出16比特的大锤子。
00010100111010100001000000001100 // x - 1
00011110111111110001100000001110 // after folding one bit
00011111111111111101111000001111 // after 2
00011111111111111111111111101111 // after 4
00011111111111111111111111111111 // after 8, and every step thereafter
在这里, x++
会将所有的都切换为零,使一个进位到下一列:
00100000000000000000000000000000 // after x++
一开始的怪异递减是,所以我们抓住<=
而不是strict <
。 例如,如果我们从
00000000000000000000000000000100 // x
00000000000000000000000000000011 // after x--
00000000000000000000000000000011 // after folding, unchanged - they're all ones anyway
00000000000000000000000000000100 // after x++
该声明
x>> 1;
x|= x>> 1;
x
对x >> 1
的结果执行按位或运算,并将结果存储在x
函数mystery(x)
获得数字x
的第二高幂。 如果数字已经是2的幂,则初始的减量语句( x--
)使函数返回相同的值。在接近INT_MAX_VALUE
时, mystery(x)
对于带符号整数将表现出有趣的INT_MAX_VALUE
。
您可以通过为x
较小值绘制函数值来得出此答案
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.