如何使用位运算符&判断奇偶数

3

我正在尝试使用位运算符&来判断数组内的数字是偶数还是奇数。

这是我的代码:

    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,用于判断一个数字是偶数还是奇数,但在这种情况下,它们都返回奇数。 以下是结果:
- 二进制中的1是1,是奇数。 - 二进制中的2是10,是奇数。 - 二进制中的4是100,是奇数。 - 以此类推...
我错在哪里了?
1个回答

5
这里的操作顺序很重要(由运算符优先级定义)。&出现在===比较之后,所以你的if语句实际上会被计算为:
if (parseInt(el.toString(2)) & (1 === 0)) {

首先执行1===0。这将导致if(<num> & false),其中false被转换为数字值0,因为它在按位&运算符的上下文中使用。因此,<num> & 0将始终评估为0,这是一个falsy value(因此总是会触发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)。

"el&1"已经是一个比较,所以您应该能够省略“=== 0”,但您需要调整消息。 - claudiodfc
我不会把 el & 1 称为比较,但你是对的,当 el & 1 计算结果为 0 时,它将被视为假。我认为在条件语句中使用 === 检查是否等于 0 更直接和清晰,因为它检查的是按位 & 是否计算为 0 - Nick Parsons

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接