小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
位操作符
位操作符也就是操作内存中表示数据的比特(位)。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位可以达到取整的效果
>>> 无符号右移
如果是正数的话与有符号右移一样,如果是负数的话则会当成正值进行右移,结果相差就比较大了