随着计算机科学的发展,数字的大小也在不断增长。在过去,JavaScript 只能处理 2 的 53 次方以内的数字,但是现在,ECMAScript 2020
引入了一种新的数据类型 BigInt
,可以处理任意大小的整数。在本文中,我们将介绍 BigInt
的基础知识,并探讨如何进行二进制运算。
BigInt 简介
在 JavaScript 中,我们通常使用 Number
类型来表示数字。但是,由于 Number
类型是基于 IEEE 754 标准实现的,因此只能表示 2 的 53 次方以内的整数。如果需要处理更大的数字,就需要使用 BigInt
类型。BigInt
类型可以表示任意大小的整数,而且可以通过在数字后面添加 n
来创建。
const bigInt = 1234567890123456789012345678901234567890n;
需要注意的是,BigInt
类型的数字不能与 Number
类型的数字混合使用,需要进行类型转换。
const bigInt = 1234567890123456789012345678901234567890n; const number = 123; const result = bigInt + BigInt(number); // 1234567890123456789012345678901234568013n
二进制运算
在计算机科学中,二进制运算是非常常见的。在 JavaScript 中,我们可以使用位运算符来进行二进制运算。位运算符包括位与(&
)、位或(|
)、位异或(^
)、左移(<<
)和右移(>>
)。
const a = 0b1100; // 12 const b = 0b1010; // 10 console.log(a & b); // 0b1000,8 console.log(a | b); // 0b1110,14 console.log(a ^ b); // 0b0110,6 console.log(a << 2); // 0b110000,48 console.log(a >> 2); // 0b0011,3
但是,在 BigInt
类型中,位运算符的行为与 Number
类型有所不同。由于 BigInt
类型可以处理任意大小的整数,因此位运算符也需要进行一些调整。
位运算符
在 BigInt
类型中,位运算符与 Number
类型的行为基本相同,但是需要注意一些细节。
位与(&
)
位与运算符返回两个数的按位与结果。
const a = 0b1100n; // 12n const b = 0b1010n; // 10n console.log(a & b); // 0b1000n,8n
需要注意的是,如果两个数的位数不同,结果将会被截断。
const a = 0b1100n; // 12n const b = 0b101n; // 5n console.log(a & b); // 0n
位或(|
)
位或运算符返回两个数的按位或结果。
const a = 0b1100n; // 12n const b = 0b1010n; // 10n console.log(a | b); // 0b1110n,14n
位异或(^
)
位异或运算符返回两个数的按位异或结果。
const a = 0b1100n; // 12n const b = 0b1010n; // 10n console.log(a ^ b); // 0b0110n,6n
左移(<<
)
左移运算符将一个数的所有位向左移动指定的位数。
const a = 0b1100n; // 12n console.log(a << 2n); // 0b110000n,48n
需要注意的是,左移的位数必须是 BigInt
类型。
右移(>>
)
右移运算符将一个数的所有位向右移动指定的位数。
const a = 0b1100n; // 12n console.log(a >> 2n); // 0b11n,3n
需要注意的是,右移的位数必须是 BigInt
类型。
位运算赋值运算符
在 BigInt
类型中,位运算赋值运算符与 Number
类型的行为基本相同,但是需要注意一些细节。
位与赋值(&=
)
位与赋值运算符将变量的值与指定的值进行按位与运算,并将结果赋值给变量。
let a = 0b1100n; // 12n a &= 0b1010n; // a = a & 0b1010n console.log(a); // 0b1000n,8n
位或赋值(|=
)
位或赋值运算符将变量的值与指定的值进行按位或运算,并将结果赋值给变量。
let a = 0b1100n; // 12n a |= 0b1010n; // a = a | 0b1010n console.log(a); // 0b1110n,14n
位异或赋值(^=
)
位异或赋值运算符将变量的值与指定的值进行按位异或运算,并将结果赋值给变量。
let a = 0b1100n; // 12n a ^= 0b1010n; // a = a ^ 0b1010n console.log(a); // 0b0110n,6n
左移赋值(<<=
)
左移赋值运算符将变量的值向左移动指定的位数,并将结果赋值给变量。
let a = 0b1100n; // 12n a <<= 2n; // a = a << 2n console.log(a); // 0b110000n,48n
需要注意的是,左移的位数必须是 BigInt
类型。
右移赋值(>>=
)
右移赋值运算符将变量的值向右移动指定的位数,并将结果赋值给变量。
let a = 0b1100n; // 12n a >>= 2n; // a = a >> 2n console.log(a); // 0b11n,3n
需要注意的是,右移的位数必须是 BigInt
类型。
总结
在 ECMAScript 2020
中,BigInt
是一项非常重要的新特性,可以处理任意大小的整数。在进行二进制运算时,需要注意 BigInt
类型与 Number
类型的差异,以及位运算符的行为和位运算赋值运算符的使用方法。掌握 BigInt
的基础知识和二进制运算的技巧,可以让我们更好地应对复杂的计算任务。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65dc5a741886fbafa49c378c