【问题标题】:& 1 JavaScript. How does it work? Clever or good? [duplicate]& 1个JavaScript。它是如何工作的?聪明还是好? [复制]
【发布时间】:2016-07-11 03:37:53
【问题描述】:

我正在研究 CodeWars 问题(IQ 测试)的解决方案,其中给您一串数字,除 1 之外的所有数字都是偶数或奇数。您需要返回与其他数字不同的数字位置的索引加 1。

我对下面发布的解决方案中显示 & 1 的行感到困惑。代码在 && 或 & 1 被带走时不起作用。

function iqTest(numbers){
  numbers = numbers.split(' ')

  var evens = []
  var odds = []

  for (var i = 0; i < numbers.length; i++) {
    if (numbers[i] & 1) { //PLEASE EXPLAIN THIS LINE!
      odds.push(i + 1)
    } else {
      evens.push(i + 1)
    }
  }

  return evens.length === 1 ? evens[0] : odds[0]
}

另外,您会考虑使用 & 1 作为最佳实践还是只是“聪明”的代码?

【问题讨论】:

    标签: javascript boolean logic operators


    【解决方案1】:

    单个&amp;'bitwise' operator。这个特定的运算符 (&amp;) 是按位与运算符 - 它在每个位位置返回一个 1,两个操作数的对应位都是 1。

    这里使用它的方式是测试numbers[i] 是偶数还是奇数。当i0 循环到numbers.length 时,对于第一次迭代,if 语句计算0 &amp; 1,其计算结果为0false。在循环的下一次迭代中,语句将为1 &amp; 1,其计算结果为1,或true

    结果 - 当numbers[i] &amp; 1 计算为0false 时,numbers[i] 被推送到odd 数组。如果numbers[i] &amp; 1 计算结果为1true,则numbers[i] 被推送到even 数组。

    &amp; 运算符测试偶数和奇数的替代方法是使用 modulo operatornumbers[i] % 2 产生相同的输出。也就是说,1 % 2 会产生 1true,任何奇数也会如此,因为奇数除以 2 会产生余数 1。而任何偶数,例如 2 % 2,都会产生 0false,因为偶数除以 2 的余数为 0。

    至于你的第二个问题,是“聪明还是好?”。这绝对是聪明的。它是否好取决于你问谁以及你的目标是什么。许多人会说它比使用num % 2 更不合逻辑且更难阅读。

    【讨论】:

      【解决方案2】:

      二进制数是01,它们都称为位。

      单个&amp; 是加法运算,按位工作。

      喜欢

      1 = 01
      2 = 10 
      3 = 11
      4 = 100
      

      可以看到奇数的最后一位是1,偶数是0

      在添加操作中

      0 & 0 = 0
      0 & 1 = 0
      1 & 0 = 0
      1 & 1 = 1
      

      所以只有奇数会返回1,偶数会返回0,仅在编程时0考虑falsy

      如果我们想检查5是奇数还是偶数

      5  = 101
      

      并用1执行and(&amp;)操作

        101 
      & 001
      -----
        001
      

      二进制001的值是1 in 10基数

      所以它会执行简单的奇偶过程。

      【讨论】:

        猜你喜欢
        • 2014-07-14
        • 1970-01-01
        • 2016-05-04
        • 1970-01-01
        • 2019-10-02
        • 1970-01-01
        • 2011-08-25
        • 2019-01-16
        • 1970-01-01
        相关资源
        最近更新 更多