位运算符
只对整数有效
以32位带符号的整数进行运算,返回值也是一个32位带符号的整数
有符号整数以31位表示整数的数值,第32位代表整数的符号,0表示正数,1表示负数,范围从-2147483648 到 2147483647
18
//二进制
10010
位运算
转换为二进制运算
-
按位或 |
每位对比执行and操作
9 | 3 9: 1001 3: 0011 => 1011 11 9 | 3 = 11
应用场景:
系统权限
假设admin用户有a,b,c,d四中权限,一般用0001,0010,0100,1000(通俗的1,2,4,8)
则admin的权限为 1 | 2 | 4 | 8 = 15
判断用户是否有某种权限
guest & 1 === 1 //是否有a权限 guest & 2 === 2 //是否有b权限 guest & 4 === 4 //是否有c权限 guest & 8 === 8 //是否有d权限
-
按位 与 &
每位对比执行且操作,都为1时才为1
9 & 3 9: 1001 3: 0011 => 0001 1 9 & 3 = 1
应用场景:判断奇偶,奇数二进制最后一位肯定为1
3 & 1 = 1 // 奇数
-
按位异或^
对比每一个比特位,当两个操作位有且只有一个1时,结果为1,否则为0
9 ^ 3 9: 1001 3: 0011 => 1010 1 9 ^ 3 = 10
应用场景:
切换变量0和1
num = boolean ? 1 : 0 //普通写法 => num = num ^ 1 // 位运算
交换两个变量的值(不用第三个变量)
let a =5,b=6 //第一种 a = a ^ b b = a ^ b a = a ^ b // b = a ^ b ^ b = a ^ (b ^ b) = a ^ 0 = a //第二种 a = a + b b = a - b a = a - b // 第三种 es6 [a, b] = [b, a]
-
按位非 ~
每位执行非操作
对任一数值x进行按位非操作,结果: ~x : - (x + 1)
~5 : -6
~-5 : 4
-
按位移动操作符
将数字转换为32为整数
-
左移 <<
3 << 2 // 向左移动2位 3 = 0000 0000 0000 0000 0000 0000 0000 0011 12 = 0000 0000 0000 0000 0000 0000 0000 1100 // 相当于十进制中算法 x * 2^n // 3 * 2^2 = 12
应用场景
rgb和16进制颜色转换
function RGBToHex(rgb) { //取出rgb中的数值 let arr = rgb.match(/\d+/g) if(!arr || arr.length !== 3) return 'rgb数值不合法' let hex = ( arr[0]<<16 | arr[1]<<8 | arr[2]).toString(16) //自动补全第一位 if(hex.length < 16){ hex = '0' + hex } return `#${hex}` }
-
-
有符号右移动 >>
x >> n
x / 2^n
应用场景
16进制和rgb颜色转换
-
无符号右移 >>>
结果为非负的
-
网友评论