我需要使用按位运算符执行某些操作,假设我们有这样的40位无符号整数:

当我对它应用OR运算符和无符号右移运算符时,我得到了这个负整数

Input:(1071698660929 >>> 0) | 0b0.

Output:-2043163071.

我注意到,只要数字是31位长,添加0B0就没有任何问题,但当数字大于31位时,即使我使用的是无符号右移位运算符,它也会变成负数:

32位二进制返回-1:(0b11111111111111111111111111111111 >>> 0) | 0

31位二进制返回2147483647:(0b1111111111111111111111111111111 >>> 0) | 0

所以我有几个问题:

  1. 如果我使用右移位运算符,为什么上面的数字会变成负数?我所理解的是,javascript中的最大安全整数是53位长Number.MAX_SAFE_INTEGER.toString(2).length,所以我在整数安全边界内.
  2. 我要怎么做才能得到这(1071698660929 >>> 0) | 0b0个回报? 1071698660929而不是-2043163071

推荐答案

按位运算符将其操作数隐式转换为32位整数(有符号或无符号,取决于运算符).在处理过程中,超过32位的数字获得其最高有效位discarded:

Before: 11100110111110100000000000000110000000000001
After:              10100000000000000110000000000001

这条规则的唯一例外是(相对)原始块上的新子块,BigInt类型:所有按位运算(&,|,^)和几乎所有移位都是该类型的overloaded.

这为您打开了一个解决问题的方法:只需使用BigInt而不是普通的number,或者显式地使用,如下所示:

const bigIntee = BigInt(1071698660929); // note no `new` here!

...或者,如果您实际上必须使用文字,则可以在后面追加n:

const bigIntee = 1071698660929n; // also works

请注意,如果一个操作数为BigInt,则另一个操作数也应为BigInt.所以这个...

bigIntee | 0

...会让JS对你回到90年代快乐无政府时代的可悲try 感到愤怒.更具体地说,您将得到一个直接抛给您的TypeError:

Cannot mix BigInt and other types, use explicit conversions

不过,这很容易修复:只需将上述转换技巧中的任何一个也应用到第二个操作数即可.

bigIntee | 0n 
// or bigIntee | BigInt(0)

两者都奏效了.不考虑0,嗯,不是真正的Biggus Integerus类型;类型安全在这里占主导地位.

不过,还有一个问题:>>>(无符号右移运算符)不能在BigInts上使用.如果您try 使用它,您将收到一个非常具体的错误:

bigIntee >>> 0n
// Uncaught TypeError: BigInts have no unsigned right shift, use >> instead

...这完全有道理(我们希望JS抛出的所有错误都是that特定的).

Javascript相关问答推荐

使用json文件字符串来enum显示类型字符串无法按照计算的enum成员值的要求分配给类型号

我开始使用/url?q=使用Cheerio

如何在mongoose中链接两个模型?

Mongoose post hook在使用await保存时不返回Postman响应

为什么!逗号和空格不会作为输出返回,如果它在参数上?

未捕获错误:[]:getActivePinia()被调用,但没有活动Pinia.🍍""在调用app.use(pinia)之前,您是否try 使用store ?""

实现JS代码更改CSS元素

背景动画让网站摇摇欲坠

postman 预请求中的hmac/sha256内标识-从js示例转换

Jexl to LowerCase()和Replace()

MongoDB通过数字或字符串过滤列表

如果对象中的字段等于某个值,则从数组列表中删除对象

为什么这个最小Angular 的Licial.dev设置不起作用?

在使用JavaScript以HTML格式显示Google Drive中的图像时遇到问题

在此div中添加一个类,并在一段时间后在Java脚本中将其删除

JSON Web令牌(JWT)错误:RSA密钥对的签名无效

MUI-TABLE:MUI表组件中交替行的不同 colored颜色 不起作用

如何在底部重叠多个div?

为什么我的Reaction组件不能使用createBrowserRouter呈现?

此上下文在JavaScript中