如何使用按位运算符计算偶数和奇数



我正在尝试使用逐位运算符&来评估数组中的数字是偶数还是奇数;。

这是我的代码:

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数字

等等…

我哪里做错了?

这里的操作顺序很重要(并且由运算符优先级定义(。&发生在===比较之后,因此if语句的计算结果实际上类似于:

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

其中首先执行CCD_ 3。这将产生if(<num> & false),其中false在逐位&运算符的上下文中使用时被转换为数值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(

最新更新