Как оценить четные и нечетные числа с помощью побитового оператора - PullRequest
2 голосов
/ 12 марта 2020

Я пытаюсь оценить, являются ли числа внутри массива четными или нечетными, используя побитовый оператор &.

Это мой код:

    arr = [1, 2, 4, 6, 9, 11, 18, 361, 5622, 5623]
    arr.forEach(function (el) {
        if (parseInt(el.toString(2)) & 1 === 0) {
            console.log(`${el} in binary is ${el.toString(2)} and it is an EVEN number`);
        } else {
            console.log(`${el} in binary is ${el.toString(2)} and it is an ODD number`);
        }
    });

Принимая каждый элемент по отдельности, каждый возвращает 0 или 1, что позволяет оценить, является ли число четным или нечетным, но в этом случае все они возвращают числа ODD. , Это то, что я получаю в результате:

1 в двоичном виде равен 1, и это номер ODD

2 в двоичном виде равен 10, и это номер ODD

4 в двоичный файл равен 100, и это номер ODD

и т. д. ...

Где я ошибся?

1 Ответ

4 голосов
/ 12 марта 2020

Здесь важен порядок операций (и определяется приоритет оператора ). & происходит после сравнения ===, поэтому ваш оператор if на самом деле оценивается следующим образом:

if (parseInt(el.toString(2)) & (1 === 0)) {

, где 1===0 выполняется первым. Это приведет к if(<num> & false), где false преобразуется в число c значение 0, поскольку оно используется в контексте побитового оператора &. Таким образом, <num> & 0 всегда будет иметь значение 0, что является ложным значением (таким образом, всегда вызывая срабатывание else -блока).

Вместо этого вы можете использовать скобки для исполнения приказа:

arr = [1, 2, 4, 6, 9, 11, 18, 361, 5622, 5623]
arr.forEach(function(el) {
  if ((el & 1) === 0) {
    console.log(`${el} in binary is ${el.toString(2)} and it is an EVEN number`);
  } else {
    console.log(`${el} in binary is ${el.toString(2)} and it is an ODD number`);
  }
});

Вы также можете напрямую использовать оператор & для своего номера (поэтому нет необходимости использовать toString для него)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...