如何正确检测大整数中是否已设置指定flags位标志
问题原因
- JavaScript 常规
Number类型是双精度64位浮点数,可精确表示的整数范围仅为-2^53 + 1~2^53 - 1,你使用的12261800583900083122远超该范围,直接赋值为Number类型时就已经出现精度丢失,数值本身不准确。 - 原生位运算符会自动将操作数转为32位有符号整数计算,超出32位的部分会直接截断,天然不支持大整数的位检测场景。
解决方案
使用ES2020新增的BigInt类型处理大整数值,所有涉及位运算的数值统一转为BigInt类型即可,修改后代码如下:
var flags = { Horde: 32n, Allianz: 64n, } // 大整数后加n后缀声明为BigInt类型,也可以用BigInt('12261800583900083122')转换 var flag = 12261800583900083122n; if ((flag & flags.Horde) === flags.Horde && (flag & flags.Allianz) === flags.Allianz) { console.log('Both'); } else if ((flag & flags.Allianz) === flags.Allianz) { console.log('Allianz'); } else if ((flag & flags.Horde) === flags.Horde) { console.log('Horde'); } else { console.log('Nothing'); }
注意事项
BigInt类型不能直接和普通Number类型混合运算,相关数值需要统一转为BigInt类型- 比较时建议使用严格相等运算符
===,避免隐式类型转换带来的异常问题
内容的提问来源于stack exchange,提问作者Berstos
相关产品推荐
相关产品推荐

