在实际编码中,如果涉及到数学运算,我们应该尽量考虑是否可以使用位运算。由于js中的数字都依照IEEE-754标准以64位存储。在位运算中,数字呗转换为有符号32位格式。每次运算符会直接操作该32位数以直接得到结果。尽管需要转换,但这个过程仍然是Js中最快的。
位运算中有六种操作符:
按位与(&)
两个操作数的对应位都是1时,则在该位返回1。
0 & 0 = 0; 0 & 1 = 0; 1 & 0 = 0; 1 & 1 = 1;
如:
var result = 25 & 3; //1
console.log(result.toString(2)); //“1”
按位或(|)
两个操作数的对应位只要有一个为1时,则在该位返回1.
0 & 0 = 0; 0 & 1 = 1; 1 & 0 = 1; 1 & 1 = 1;
如:
var result = 25 & 3; //27
console.log(result.toString(2)); //“11011”
按位异或(^)
两个操作数的对应位只有一个为1,则在该位返回1.
0 & 0 = 0; 0 & 1 = 1; 1 & 0 = 1; 1 & 1 = 0;
如:
var result = 25 & 3; //26
console.log(result.toString(2)); //“11010”
按位取反(~)
操作位,遇0返回1,遇1返回0。
如:
var result = ~25; //-26
console.log(result.toString(2)); //"-11010"
左移
左移运算符m<<n,表示把m左移n位。在左移过程中,最左边的n位将被丢弃,同时在最右边补0。
比如:
00001010 << 2 = 00101000
右移
右移处理过程类似左移,只不过需要考虑是否有符号位。如果数字原先是负数,则右移之后在最左边补1,反之补0。
比如:
00001010 >> 2 = 00000010;
10001010 >> 2 = 11110001;