在JS中为什么要使用位运算符

475 阅读6分钟

前言

在JS运算符中有一种位运算符,不仅可以使代码更加简洁还能提高性能等,更重要的是可以装逼。哈哈哈。下面就让我们全面了解和在实际应用中如何使用吧

概述

在JavaScript中,位运算符(Bitwise Operators)是对整数(32位二进制数)进行位级操作的运算符。这些运算符直接操作数字的二进制表示,允许你进行诸如位与、位或、位非、左移、右移等操作。位运算符在处理低级数据操作、性能优化、特定算法实现等场景中非常有用。

按位与(&)和(&=)

用法: 用于对两个数的二进制表示进行逐位比较,并返回一个新的二进制数,其中只有对应位都为1时才为1,否则为0。

示例:

let a = 5; // 0101

a = a & 3
// 等同于
a &= 3; //3的二进制是:0011,结合&的运算得出结果0001再转为十进制并且赋值给a

console.log(a); //1

计算步骤和结果:

image-20241225154114933.png

使用场景:

  • 判断奇偶数:num & 1的结果为0表示num是偶数,非0表示num是奇数。

    • const Odd = 1
      const Even = 2
      
      console.log(odd & 1) // 结果为1
      console.log(even & 1) // 结果为0
      
  • 处理颜色值

    • // 十六进制颜色值,
      let color = 0xFF5533;// 二进制: 1111 1111 0101 0101 0011 001
      // 提取蓝色分量
      let blueMask = 0x0000FF; // 二进制: 0000 0000 0000 0000 1111 1111
      let blue = color & blueMask; // 结果: 0000 0000 0000 0000 0011 0011
      
      console.log(blue); // 输出: 51 (蓝色分量)
      

按位或(|)和(|=)

用法: 于对两个数的二进制表示进行逐位比较,并返回一个新的二进制数,其中只要对应位有一个为1,则该位就为1,否则为0。

示例:

const a = 5; // 0101

a = a | 3
// 等同于
a |= 3 //3的二进制是:0011,结合|的运算得出结果并且赋值给a

console.log(a); // 结果:0111 转换成十进制就是 7

计算步骤和结果:

image-20241225154450793.png

使用场景:

  • 组合权限或标志

    • let readPermission = 0b100; // 二进制: 100 (即 4),表示读权限
      let writePermission = 0b010; // 二进制: 010 (即 2),表示写权限
      let executePermission = 0b001; // 二进制: 001 (即 1),表示执行权限
      
      let combinedPermissions = readPermission | writePermission | executePermission;
      
      console.log(combinedPermissions); // 输出: 7 (二进制: 111),表示读、写和执行权限都有
      

按位非(~)

用法: 对二进制进行逐位取反操作。这意味着,如果某一位是1,则将其变为0;如果某一位是0,则将其变为1。

示例:

const a = 5;

console.log(~a) // 结果:-6

计算步骤和结果:

5的32位整数形式是00000000000000000000000000000101,二进制否运算以后得到11111111111111111111111111111010。由于第一位(符号位)是1,所以这个数是一个负数。JavaScript 内部采用补码形式表示负数,即需要将这个数减去1,再取一次反,然后加上负号,才能得到这个负数对应的10进制值。这个数减去1等于11111111111111111111111111111001,再取一次反得到00000000000000000000000000000110,再加上负号就是-6

image-20241225164406365.png

使用场景:

  • 取绝对值

    • // 因为按位非取值都会比原值整数小一位
      const a = 5
      
      console.log(~a+1) // 结果:-5
      
  • 取整数(注意:这个取整不管小数点是否可以进一,都去当前整数)

    • // 因为按位非取值都会比原值整数小一位
      const a = 5.234
      
      console.log(~a+1) // 结果:-5
      

按位异或(^)和 (^=)

用法: 二进制进行逐位比较的操作符。如果两个对应位的值不同,则该位的结果为1,相同则为0

示例:

const a = 5; // 0101

a = a ^ 3
// 等同于
a ^= 3; // 0011

console.log(a); //  得出新的二进制0110转换成十进制就是6

计算步骤和结果:

image-20241225170040369.png

使用场景:

  • 切换布尔值

    • let flag = true; // 初始值为true
      flag ^= 1; // 切换flag的值
      console.log(flag); // 输出: false
       
      flag ^= 1; // 再次切换flag的值
      console.log(flag); // 输出: true
      
  • 快速交换两个变量的值

    • let a = 10;
      let b = 20;
       a ^= b; // a现在为30(二进制00011110)
       b ^= a; // b现在为10(二进制00001010),因为30 ^ 20 = 10
       a ^= b; // a现在为20(二进制00010100),因为30 ^ 10 = 20
      console.log(a); // 输出20
      console.log(b); // 输出10
      

左移 (<<)和(<<=)

用法: 用于将一个数的二进制表示向左移动指定的位数

示例:

let number = 5; // 二进制表示为 0101

number = number << 2; // 左移2位
// 等同于
number <<= 2

console.log(result); // 输出 20,二进制表示为 00010100

计算步骤和结果:

image-20241226104709006.png

使用场景:

  • 取整

    • const a = 5.234 << 0
      
      console.log(5) // 结果:5
      
  • 快速乘以2的幂次方

    • let number = 10;
      let result = number << 3; // 相当于乘以2的3次方(即8)
      
      console.log(result); // 输出 80
      

右移(>>)和(>>=)

用法: 用于将一个数的各二进制位全部右移若干位,由符号位的值决定左边空出的位是填入0还是1(对于有符号整数而言,符号位为1表示负数,为0表示正数或零)。

示例:

let number = 8; // 二进制表示为 1000

number = number >> 1; // 右移1位
// 等同于
number >>= 1

console.log(number); // 输出 4,二进制表示为 0100

计算步骤和结果:

image-20241226104321428.png

使用场景:

  • 取整

    • const a = 5.234 >> 0
      
      console.log(5) // 结果:5
      
  • 数值缩放

    • let value = 16; // 初始值为16
      
      value >>= 1
      // 等同于
       value = value >> 1; // 将值右移1位,相当于除以2
      
      console.log(scaledValue); // 输出 8
      

无符号右移(>>>)和(>>>=)

用法: 它将一个数的各二进制位全部右移若干位,与有符号右移(>>)不同的是,无论数的正负,左边空出的位都填充为0。

示例:

let number = -9; // 二进制表示为11111111111111111111111111110111(32位补码表示)

 number = number>>>2
// 等同于
 number >>>= 2; // 无符号右移2位

console.log(number); // 输出1073741821 ,因为左边空出的位被填充为0

计算步骤和结果:

image-20241226110112632.png

使用场景:

  • 取整

    • const a = 5.234
      
       a>>>= 0
      
      console.log(a) // 结果:5
      

参考