任何人都可以解释下面的代码做什么以及它如何工作?

时间:2013-01-29 05:50:13

标签: javascript bit-manipulation

我的老师说这是javascript,如果有帮助

function mystery(x) { 
  x--; 
  x|= x>> 1; 
  x|= x>> 2; 
  x|= x>> 4;
  x|= x>> 8; 
  x|= x>> 16; 
  x++; 
  return x; 
}

3 个答案:

答案 0 :(得分:3)

它找到2的最低幂,大于或等于x。或者,x--之后的所有内容都会找到x-1中所有内容的最低位。

例如,如果您有x - 1

00010100111010100001010011101010

然后mystery(x)将是

00100000000000000000000000000000

它首先填充一个后面的所有零,将右边的那些零折叠起来;在第一次操作之后,每个人都会有一个跟随它。然后我们折叠两位组:每两个组现在将变为四组。然后我们折四,然后八折。然后我们拿出十六位的大锤子。

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++

开始时的奇怪减量是我们抓住<=而不是严格<。例如,如果我们从

开始
00000000000000000000000000000100  // x
00000000000000000000000000000011  // after x--
00000000000000000000000000000011  // after folding, unchanged - they're all ones anyway
00000000000000000000000000000100  // after x++

答案 1 :(得分:1)

声明

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

x|= x>> 1;

  • 使用x >> 1x的结果执行按位OR运算,并将结果存储在x

答案 2 :(得分:1)

函数mystery(x)获得数字x中2的最高幂。如果数字已经是2的幂,则初始递减语句(x--)使函数返回相同的值。mystery(x)在接近{{INT_MAX_VALUE时将对有符号整数表示有趣 1}}。

您可以通过绘制x

的小值的函数值来得出此答案