按位运算符的评估

时间:2014-08-25 08:20:10

标签: javascript

我真的不明白为什么a * 51 & 52在下面的代码中对9,14,19,24的false进行评估。我知道间隔是5但是为什么使用51和52以及我将使用什么数字作为例如间隔为6?

for(               // loop :)
      b=a='';        // b - result , a - numeric variable
      a++<36;        // 
      b+=a*51&52  // if "a" is not 9 or 14 or 19 or 24
                  ?  //  return a random number or 4
         (
           a^15      // if "a" is not 15
              ?      // genetate a random number from 0 to 15
           8^Math.random()*
           (a^20?16:4)  // unless "a" is 20, in which case a random number from 8 to 11
              :
           4            //  otherwise 4
           ).toString(16)
                  :
         '-'            //  in other cases (if "a" is 9,14,19,24) insert "-"
      );
return b

2014年8月25日15:35更新:对不起,也许我的问题有点不清楚。我想要一个逻辑或数学解释,为什么按位比较只评估为9,14,19,24的假。我知道按位运算符的作用以及它是如何工作的但是我真的没有得到上面使用的模式的逻辑。该代码实际上是从一个要点中获取的,以生成随机的v4 UUID(参见https://gist.github.com/LeverOne/1308368),我将其命名为大小优化的代码而不是模糊的代码。

2 个答案:

答案 0 :(得分:1)

实际上,a*51&52评估为0 false(而不是true)9,14,19,24。

如果您在程序员模式下打开Windows计算器并输入9 * 51和52,您将自己看到它。

肯定也是数学上的原因,你可以尝试调查更多...

答案 1 :(得分:0)

嗯,这很简单:

51_10 is 110011_2
52_10 is 110100_2
9*52_10 = 459_10 is 111001011_2

如果您使用 a * 51 52 并执行二进制和

00000110100  //52
00111001011  //459  = 51 * 9
01011001010  //714  = 51 * 14
01111001001  //969  = 51 * 19
10011001000  //1224 = 51 * 24

你会得到

00000000000

每一次。 0 =错误

  

参考wiki