在编程世界里,很多语言本身就提供有位运算:如PHP、Java等。当然了,JavaScript本身也提供了位运算。相信很多人都对JavaScript中的位运算比较陌生。
今天,笔者就来详谈一下JS中的6个位运算符(&、|、^、~、<<、>>)。
在编程世界里,很多语言本身就提供有位运算:如PHP、Java等。当然了,JavaScript本身也提供了位运算。相信很多人都对JavaScript中的位运算比较陌生。
今天,笔者就来详谈一下JS中的6个位运算符(&、|、^、~、<<、>>)。
位运算符是把操作数看作一系列单独的位,而不是一个数字值。数值或字符在内存中被存储为0和1的序列,每个0或1被称之为1个位。比如说10进制1在计算机内被存储为00000001。如果我们把00000001中的1往前移动一位00000010,就变成了10进制的2了。所以,在编程语言中,合理利用位运算可以极大方便我们处理一些问题。
位运算符的优点与缺点:
1、位运算直接对二进制位进行计算,是非常底层的运算。因此,运算速度极快;
2、位运算只对整数起作用,如果一个运算数不是整数,会自动转为整数后再运行;
3、很多人不了解位运算符,因此,写法虽然简单但不直观。
1、&按位与
&表示两个二进制位,同位都为1时,则返回1,否则返回0
在以前,我想要判断一个数是奇数还是偶数,我们往往会这样写:
- if (num % 2) {
- console.log('num是偶数');
- } else {
- console.log('num是奇数');
- }
现在我们可以这样写:
- if (num & 1) {
- console.log('num是奇数');
- } else {
- console.log('num是偶数');
- }
2、|按位或
|表示两个二进制位,同位都为0时,则返回0,否则返回1
在以前,我们对浮点数进行求整,我们往往会这样写:
- var num = parseInt(3.14);
现在我们可以这样写:
- var num = 3.14 | 0;
注:原因在于浮点数不支持位运算,所以会先转换成整数再和0的二进制进行按位或;利用这一点,我们可以对正数进行向下取整,对负数进行向上取整
3、^按位异或
^表示两个二进制位,同位中有且仅有一个为1时,则返回1,否则返回0
在以前,我们要实现0变1、1变0,我们往往会这样写:
- num = Number(!num);
现在我们可以这样写:
- num ^= 1;
4、~按位取反
~表示将一个二进制位,位中的1变成0,0变成1
对于~按位取反,我们往往使用的的~~(会隐士类型转换)来进行求整操作。浮点数不支持位运算,所以会先转换成整数再进行运算;利用这一点,我可以对正数进行向下取整,对负数进行向上取整
5、<<按位左移
<<表示把一个二进制位向左移动一位,长度保持不变,超过的位将丢失,而空出的位则补0
利用这个特性,我们按位左移1位,可以进行乘法操作:
- console.log(4 << 1) // 8
6、>>按位右移
>>表示把一个二进制位向右移动一位,长度保持不变,超过的位将丢失,而空出的位则补0
利用这个特性,我们按位右移1位,可以进行除法操作:
- console.log(8 >> 1) // 4
注:任何小数,我们按位右移0位,可以进行取整操作