在我看来按位运算符应该有7个:
一、& 按位与
&是二元运算符,它以特定的方式的方式组合操做数中对应的位,若是对应的位都为1,那么结果就是1, 若是任意一个位是0 则结果就是0。
1 & 3的结果为1
那咱们来看看他是怎么运行的
1的二进制表示为 0 0 0 0 0 0 1
3的二进制表示为 0 0 0 0 0 1 1
根据 & 的规则 获得的结果为 0 0 0 0 0 0 0 1,十进制表示就是1
二、| 按位或
|运算符跟&的区别在于若是对应的位中任一个操做数为1 那么结果就是1。
1的二进制表示为 0 0 0 0 0 0 1
3的二进制表示为 0 0 0 0 0 1 1
因此 1 | 3的结果为3
三、^ 按位异或
^运算符跟|相似,但有一点不一样的是 若是两个操做位都为1的话,结果产生0。
1的二进制表示为 0 0 0 0 0 0 1
3的二进制表示为 0 0 0 0 0 1 1
因此 1 ^ 3的结果为2
四、~ 按位非
~运算符是对位求反,1变0,0变1,也就是求二进制的反码
1的二进制表示为 0 0 0 0 0 0 1
因此 ~1 的结果是-2
五、>> 右移
>>运算符使指定值的二进制全部位都右移规定的次数,对于其移动规则只需记住符号位不变,左边补上符号位即按二进制形式把全部的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。
1的二进制表示为 0 0 0 0 0 0 1
因此 1>>1的结果为0
六、<< 左移
<<运算符使指定值的二进制全部位都左移规定的次数,对于其移动规则只需记住丢弃最高位,0补最低位即按二进制形式把全部的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
1的二进制表示为 0 0 0 0 0 0 1
因此 1<<1的结果为2 七、>>> 无符号右移
>>>运算符忽略了符号位扩展,0补最高位,可是只是对32位和64位的值有意义。
位运算符在js中的妙用:
一、使用&运算符判断一个数的奇偶
偶数 & 1 = 0
奇数 & 1 = 1
那么0&1=0,1&1=1
二、使用~~,>>,<<,>>>,|来取整
~~3.14 = 3
3.14 >> 0 = 3
3.14 << 0 = 3 3.14 | 0 = 3 3.14 >>> 0 = 3(>>>不可对负数取整)
注意:~~-3.14 = -3 其它的同样
三、使用<<,>>来计算乘除
乘法:
1*2 = 2
1<>1 = 1(2/2的一次方)
四、利用^来完成比较两个数是否相等
1 ^ 1 = 0
1 ^ 非1数 !=0
因此同一个数……同一个数等于0,不然不等于0
五、使用^来完成值交换
a = 1
b = 2
a ^= b
b ^= a
a ^= b
结果a=2,b=1
六、使用&,>>,|来完成rgb值和16进制颜色值之间的转换
16进制颜色值转RGB:
1 function hexToRGB(hex){ 2 var hex = hex.replace("#","0x"), 3 r = hex >> 16, 4 g = hex >> 8 & 0xff, 5 b = hex & 0xff; 6 return "rgb("+r+","+g+","+b+")"; 7 }
RGB转16进制颜色值:
1 function RGBToHex(rgb){ 2 var rgbArr = rgb.split(/[^\d]+/), 3 color = rgbArr[1]<<16 | rgbArr[2]<<8 | rgbArr[3]; 4 return "#"+color.toString(16); 5 }
运行hexToRGB("#ffffff")返回"rgb(255,255,255)"
运行RGBToHex("rgb(255,255,255)")返回"#ffffff"
~ 运算符查看表达式的二进制表示形式的值,并执行位非运算。
Javascript 按位取反运算符 (~) ,对一个表达式执行位非(求非)运算。如 ~1 = -2; ~2 = -3;
js取反我只知道个!,可是~为何也叫取反,他返回的又不是boolean类型?
~1,~2 的二进制又不是 -2 ,-3 ,怎么会转换成这么奇怪的值?
网友解答:
按位取反还真和boolean
没多大关系,大致流程是这样的:
就来看看~1
的计算步骤:
- 将
1
(这里叫:原码)转二进制 =00000001
- 按位取反 =
11111110
- 发现符号位(即最高位)为
1
(表示负数),将除符号位以外的其余数字取反 =10000001
- 末位加1取其补码 =
10000010
- 转换回十进制 =
-2
有网友对上面的答案进行了三点补充,以下:
- 按位取反的运算规则这么奇怪并非JavaScript独有的,而是全部的计算机语言都是这样的。这样作的主要缘由是为了为了统一减法和加法,在计算机中,减法会变成加一个负数,而负数会以补码的形式存储。而这样主要是由于补码和数字的十进制数有这么转换关系,负数:
补码(x) = -x - 1
,正数:补码(x) = x
- 由于补码是针对负数存在的,那么只要数据类型有
无符号数
,就没有这样的烦恼了,好比C语言有无符号整型,就能对无符号整型直接按位取反。
- 若是没有无符号类型,并且也只是想要按位取反,而不是附带补码的按位取反,须要另外的方法。让全1的数据和当前数据作按位抑或就好了。好比,你有一个32位的数据a,须要对它作按位取反,那么这样就好了:
0xFFFF ^ a