二进制位运算符

337 阅读3分钟

1.概述

二进制位运算符用于直接对二进制位进行计算,一共有7个:

  • 或运算符or:|,表示若两个二进制位都为0,结果为0,否则为1
  • 与运算符and:&,表示若两个二进制位都为1,结果位1,否则为0
  • 否运算符not:~,表示对一个二进制位取反
  • 异或运算符xor:^,表示若两个二进制位不相同,结果为1,否则为0
  • 左移运算符left shift:<<
  • 右移运算符right shift:>>
  • 头部补零的右移运算符zero filled right shift:>>> 这些位运算符直接处理每一个比特位(bit),所以是非常底层的运算,好处是速度极快,缺点是不直观,许多场合不能使用,否则会使代码难以理解和查错。 位运算只对整数起作用,且做位运算时,是以32位带符号的整数进行运算,并且返回值也是一个32位带符号的整数。

2.二进制或运算符(|)

  • 二进制或运算符逐位比较两个运算子,两个二进制位之中只要有一个为1,就返回1,否则返回0
  • 位运算只对整数有效,遇到小数时,会将小数部分舍去,只保留整数部分

3.二进制与运算符(&)

  • 逐位比较两个运算子,两个二进制位之中只要有一个位为0,就返回0,否则返回1

4.二进制否运算符(~)

  • 将每个二进制位都变为相反值(0变为1,1变为0),它的返回结果有时比较难理解,因为涉及到计算机内部的数值表示机制
  • 简单记忆:一个数与自身的取反值相加,等于-1
  • 对一个整数连续两次二进制否运算,得到其自身
  • 所有的位运算都只对整数有效,所以对一个小数连续两次二进制否运算,能达到取整效果(使用二进制否运算取整,是所有取整方法中最快的一种)
  • 对字符串进行二进制否运算,JavaScript引擎会先调用Number函数,将字符串转为数值
  • 对于其他类型的值,二进制否运算也是先用Number转为数值,再进行处理

5.异或运算符(^)

  • 异或运算符^在两个二进制位不同时返回1,相同时返回0
  • 异或运算有一个特殊运用,连续对两个数a和b进行三次异或运算,可以互换它们的值。这意味着使用异或运算可以在不引入临时变量的前提下,互换两个变量的值,这是互换两个变量的值的最快方法
  • 异或运算也可以用来取整

6.左移运算符(<<)

左移运算符表示将一个数的二进制值向左移动指定的位数,尾部补0,即乘以2的指定次方。(8<<2相当于8乘以2的2次方)向左移动的时候,最高位符号位是一起移动的。

  • 十进制转为二进制,二进制左移一位,在将该数转为十进制(减去1后取反,再加上负号)
  • 如果左移0位,就相当于将该数值转为32位整数,等同于取整,对于正数和负数都有效
  • 左移运算符用于二进制数值非常方便(将颜色的RGB值转为HEX值)

7.右移运算符(>>)

右移运算符表示将一个数的二进制值向右移动指定的位数。如果是正数,头部全部补0;如果是负数,头部全部补1。右移运算符基本相当于除以2的指定次方(8>>2相当于8除以2的2次方)

  • 右移运算可以模拟2的整除运算

8.头部补零的右移运算符

一个数的二进制形式向右移动时,头部一律补零,而不考虑符号位,所以该运算总是得到正值。

  • 对于正数,该运算的结果与右移运算符完全一致
  • 查看一个负整数在计算机内部的储存形式,最快的方法就是使用这个运算符

9.开关作用

位运算符可以用作设置对象属性的开关

  • 设置四个开关,每个开关分别占有一个二进制位
  • 用二进制与运算,检查当前设置是否打开了指定开关