按位运算符
从大三开始正式学习一门语言到现在,目前学了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) }