为什么我得到 '&' 运算符的 '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));
我无法理解为什么我在仅对某些数字执行 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));