简单了解位操作符

378 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

位操作符

位操作符也就是操作内存中表示数据的比特(位)。ECMAScript中的所有数值都以64 位格式存储,但位操作并不直接应用到 64 位表示,而是先把值转换为32 位整数,再进行位操作,之后再把结果转换为 64 位。对开发者而言,就好像只有 32 位整数一样,因为 64 位整数存储格式是不可见的。既然知道了这些,就只需要考虑 32 位整数即可。有符号整数使用 32 位的前 31 位表示整数值。第 32 位表示数值的符号,如 0 表示正,1 表示负。

~ 按位非

按位非操作符用波浪符(~)表示,它的作用是返回数值的一补数(反码)。即:每个 0 都变成 1,每个 1 都变成 0

看下面的例子:

let num1 = 25; //    二进制 00000000000000000000000000011001
let num2 = ~num1; // 二进制 11111111111111111111111111100110
console.log(num2); // -26

这里,按位非操作符(~)作用到了数值25,得到的结果是-26。由此可以看出,按位非的最终效果是对数值取反并减1,就想执行如下操作的结果一样:

let num1 = 25;
let num2 = -num1 - 1;
console.log(num2); // -26

实际应用 :if (~[1, 2, 3].indexOf()) {}

实际上,尽管两者返回的结果一样,但位操作的速度快得多。这是因为位操作是在数值的底层表示上完成的。

!! 转换为Boolean类型

// 强制转换为Boolean 用 !!
var bool = !!"c";
console.log(typeof bool); // boolean

& 按位与

按位与操作在两个位都是 1 时返回 1,在任何一位是 0 时返回 0。

实际应用 :a&1 判断一个数的奇偶,返回0则是偶数,返回1则是奇数

| 按位或

按位或操作在至少一位是 1 时返回 1,两位都是 0 时返回 0。

^ 按位异或

按位异或与按位或的区别是,它只在一位上是 1 的时候返回 1(两位都是 1 或 0,则返回 0)。

实际应用

<< 左移

左移会按照指定的位数将数值的所有位向左移动。数值左移后右边会出现空位,空位则用0补上。

比如,如果数值 2(二进制 10)向左移 5 位,就会得到 64(二进制 1000000)

注意:左移后符号位是不变的,会保留原有的符号

实际应用: 取整:一个数左移0位可以达到取整的效果

>> 右移

有符号右移由两个大于号(>>)表示,会将数值的所有 32 位都向右移,同时保留符号(正或负)。有符号右移实际上是左移的逆运算。比如,如果将 64 右移 5 位,那就是 2。同样,空位用0补上。

实际应用: 取整:一个数右移0位可以达到取整的效果

>>> 无符号右移

如果是正数的话与有符号右移一样,如果是负数的话则会当成正值进行右移,结果相差就比较大了