位运算符
js中位运算符在日常开发需求中其实很少有用到,但是在算法中确实非常有用,特别是涉及到二进制的时候,他能将一个十进制数字转换成另外一个十进制数字,这给我们在一些场景提供了便利,比如base64的算法中,8位二进制取6位再转十进制等 其实大家去看w3c文档,或者翻下书应该都能学习,这里小弟只是简单做个记录,因32位数字太长,故会省去前面的一些位数,大家自行脑补哈~~~~~~~~~~~
常用运算符
- 位运算 NOT
- 位运算 AND
- 位运算 OR
- 位运算 XOR
- 左移运算
- 有符号右移运算
ps:这里少了一个无符号右移运算,是因为这个不太好用,用不好容易出事,小弟目前也没怎么用过,这里就不说了哈~~~~~~~~~~~~
位运算 NOT (~)
该运算符的处理逻辑如下:
1.把运算数转换成 32 位数字 2.把二进制数转换成它的二进制反码 3.把二进制数转换成浮点数
说白了就是取反,0变成1,1变成0
例如: var iNum1 = 25; //25 等于 00000000000000000000000000011001 var iNum2 = ~iNum1; //转换为 11111111111111111111111111100110 alert(iNum2); //输出 “-26”
位运算 AND (&)
该运算符的处理逻辑如下:
1.将两个数字分别转换成二进制 2.两个二进制逐位进行与运算,只有都是1才得到1,其他都是0
例如:25&3
0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
得到的结果为
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
00000001转成十进制是1,所以25&3得到的结果是1
位运算 OR (|)
该运算符的处理逻辑如下:
1.将两个数字分别转换成二进制 2.两个二进制逐位进行或运算,只有都是0才得到0,其他都是1
例如:25 | 3
0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
得到的结果为
0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 |
00011011转换成十进制为27,所以25|3得到的记过为27
位运算 XOR (^)
该运算符的处理逻辑如下:
1.将两个数字分别转换成二进制 2.两个二进制逐位进行或运算,只有一个1的时候才返回1,其他都是0
例如:25 | 3
0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
得到的结果为
0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 |
00011011转换成十进制为26,所以25|3得到的记过为26
左移运算 («)
左移运算由两个小于号表示(«)。它把数字中的所有数位向左移动指定的数量
例如:2«5
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
向左移动5位,右边补0,得到的结果为:
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
1000000转换成十进制为64,所以2«5为64
有符号右移运算 (»)
该运算符把 32 位数字中的所有数位整体右移,同时保留该数的符号(正号或负号)
例如:64»5
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
向左移动5位,右边补0,得到的结果为:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
10转换成十进制为2,所以64»5为2
本文参考链接:
- http://www.w3school.com.cn/js/pro_js_operators_bitwise.asp