按位运算符


从大三开始正式学习一门语言到现在,目前学了C++,JavaScript,C#。语言的基本语法都没太多好说的,但是有部分内容学这些语言的时候都没认真看,那就是按位运算符。要说原因,还是因为平时用到的太少了。

JS中的位运算符

&,按位与,对每对比特位进行与操作。只有比特位双方都为1时,结果的对应比特位上才是1。

|,按位或,对每对比特位进行或操作。如果两者互相对应的比特位中至少有一个是1,则结果的对应比特位上是1。

^,按位异或,对每对比特位执行异或操作。如果两者对应比特位不同,则结果的对应比特位上是1。

~,按位取反,对每个比特位执行非操作,0和1取反。

<<,左移,a << b 将a的二进制形式向左移b(<32)比特位,右边用0填充。

>>,带符号右移,a>>b 将a的二进制向右移b(<32)比特位,丢弃被移除的位。

>>>,无符号右移,a>>> b 将 a 的二进制表示向右移 b (< 32) 位,丢弃被移出的位,并使用 0 在左侧填充。

一些用法:

1.n&1判断奇偶

偶数 & 1 = 0

奇数 & 1 = 1

原理:奇数的最低位一定是1, 1和1按位与结果为1,否则为0。

2.用~~,>>, <<,>>>,|取整

~~3.14 = 3

3.14 >> 0 =3

3.14 << 0 = 3

3.14 | 0 = 3

3.14 >>> 0 = 3(>>>不可对负数取整)

3.用<<,>>计算乘除

a >> b 相当于a除以2的b次方(取整)

4.用^比较两个数是否相等

a ^ a = a

(a ^ b) ^ b = a

5.rgb值和16进制颜色值转换

function HexToRGB(hex){
  hex = hex.replace("#", "0x")
  let r = hex >> 16
  let g = hex >> 8 & 0xff
  let b = hex & 0xff
  return `rgb(${r}, ${g}, ${b})`
}
function RGBToHex(rgb){
    let rgbArr = rgb.split(/[^\d]+/)
    let color = rgbArr[1]<<16 | rgbArr[2]<<8 | rgbArr[3]
    return "#"+color.toString(16)
}