详解位运算符的一些特点
我们都知道位运算符比正常的运算符速度要快,但是为什么会快呢?首先我们正常的运算符也是通过计算机通过位运算调用栈来实现的。
那么javascript位运算符有哪些呢?
1. & 按位与
2. | 按位或
3. ^ 按位异或
4. ~ 取反
5. >> 按位左移
6. >> 按位右移
说明:
(1)位运算符中除 ~ 外,均为二目运算符,即要求出侧各有一个运算量。
(2)运算早只能是整型或字符型的数据,不能为实型数据。
1.按位与 &
左值与右值都为true,则为true,否则就为false。
console.log(5&7);//5 首先我们先把5跟转成2进制,2进制是逢二进一,什么意思呢?如下图,得到的总数就是 1+0*(2*1)+1*(2*2)=5=101,同理可以得到7=1+1*(2*1)+1*(2*2) =111
那么根据位运算的道理,两个都要一样才为true,否则为0,那么5&7 得到的就是 101 & 111 ==101 = 5
2.按位或 |
左值与右值只要有一个为true,则为true,否则就为false。
console.log(5|7);//7
console.log(5|7);//7 首先我们先把5跟转成2进制,2进制是逢二进一,什么意思呢?如下图,得到的总数就是 1+0*(2*1)+1*(2*2)=5=101,同理可以得到7=1+1*(2*1)+1*(2*2) =111
那么根据位运算的道理,只要一个为true,就为1,否则为0,那么5&7 得到的就是 101 | 111 ==111 = 7
3.按位异 ^
若参与计算的两个二进位为同号则为0,异号则为1
console.log(true ^ true);//0 console.log(true ^ false);//1 console.log(false ^ false);//0 console.log(false ^ true);//1
console.log(5^7);//2 首先我们先把5跟转成2进制,2进制是逢二进一,什么意思呢?如下图,得到的总数就是 1+0*(2*1)+1*(2*2)=5=101,同理可以得到7=1+1*(2*1)+1*(2*2) =111
那么根据位运算的道理,两个同号就为0,异号就为1,那么5^7 得到的就是 101 ^ 111 ==010 = 2
4.按位取反 ~
console.log(~2.5);//-3 取反之后向下取整
5.按位左移 <<
按位左移相当于 *2^n 2的n次方 并且向下取整
console.log(5<<2);//20 5*x2*2=20
6.按位右移 >>
按位右移相当于 /2^n 除以2的n次方 并且向下取整
console.log(5>>2);//1 5*/(2*2)=1.25 向下取整为 1