为什么我得到 '&' 运算符的 'NaN'?

why I am getting 'NaN' for '&' operator?

我无法理解为什么我在仅对某些数字执行 AND 位运算符时得到这个“NaN”?请查看我附上的图片以清楚地了解我的问题。

'use strict';

function getMaxLessThanK(n, k) {


  let toknowNum = [];
  let bitVal = [];
  let topop = [];
  if (2 <= n && n <= Math.pow(10, 3) && 2 <= k && k <= n) {
    let z = 0;
    for (let i = 1; i < n; i++) {
      for (let j = 2 + z; j <= n; j++) {
        if (i !== j) {
          toknowNum.push([i, j]);

        }
      }
      z++;
    }

    toknowNum.forEach(val => {
      bitVal.push(parseInt((val[0].toString(2) & val[1].toString(2)), 2))
      console.log( val, parseInt((val[0].toString(2) & val[1].toString(2)), 2))
    })

    bitVal.sort();

    bitVal.forEach(val => {
      if (val < k) {
        topop.push(val);
      }
    })

    return topop.pop();
  }
  console.log(toknowNum, bitVal);
  return 'please check enter values';
}
console.log(getMaxLessThanK(8, 4));

here is my issue pic

发生这种情况是因为 bitVal.push(parseInt((val[0].toString(2) & val[1].toString(2)), 2)) 行。

在你的例子中,让我们考虑 val = [4,8] 现在,val[0].toString(2) 将是 100,而 val[1].toString(2) 将是 1000。\

所以,当你执行(val[0].toString(2) & val[1].toString(2))时,它将是"100" & "1000"(注意两者都是字符串)。

但是,由于JS不能对字符串进行按位运算,这些字符串会转为整数(以10为底),所以上面的运算就是100 & 1000(注意都是转整数),这将产生一个值 96(执行二进制 & 后的实际值)。

而现在,当您尝试执行 bitVal.push(parseInt((val[0].toString(2) & val[1].toString(2)), 2)) 时,它将是 bitVal.push(parseInt(96, 2))。由于 96 不是二进制数,因此 parseInt(96,2) 将是 NaN.

要解决此问题,只需将此行更新为如下所示: bitVal.push(val[0] & val[1]).

完整代码如下:

'use strict';

function getMaxLessThanK(n, k) {


  let toknowNum = [];
  let bitVal = [];
  let topop = [];
  if (2 <= n && n <= Math.pow(10, 3) && 2 <= k && k <= n) {
    let z = 0;
    for (let i = 1; i < n; i++) {
      for (let j = 2 + z; j <= n; j++) {
        if (i !== j) {
          toknowNum.push([i, j]);

        }
      }
      z++;
    }

    toknowNum.forEach(val => {
      bitVal.push(val[0] & val[1])
      console.log(val, (val[0] & val[1]))
    })

    bitVal.sort();

    bitVal.forEach(val => {
      if (val < k) {
        topop.push(val);
      }
    })

    return topop.pop();
  }
  console.log(toknowNum, bitVal);
  return 'please check enter values';
}
console.log(getMaxLessThanK(8, 4));