我正在尝试使用逐位运算符&来评估数组中的数字是偶数还是奇数;。
这是我的代码:
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(