参考地址: 这么骚的 js 代码,不怕被揍么
在开始之前,我们需要先看这样一段话
按照 ECMAScript 标准,两个需要运算的值会被先转为有符号的 32 位整型,所以超过 32 位的整数会被截断,而小数部分则会被直接舍弃。
1. 使用左移运算符 << 迅速得出 2 的次方
左移运算,是将每一位的数字都向左移动一位。我们以数字 10 为例
当我们对数字 10 进行左移的时候,它会先被转化为 32 位的二进制数。最高一位为符号位(正数为 0,负数为 1)。
然后进行左移,符号位保持不变,其余位依次向左移动一位,右侧以 0 填充。
然后化为十进制就是所得结果,为 20 。我们来验证一下
// 数字 10 左移 1 位
console.log(10 << 1);
十进制数左移一位,就扩大了 10 倍。二进制左移一位则扩大 2 倍。
所以,我们可以通过左移,快速获得 2 的 n 次方。
// 1 * (2 的 10 次方),也就是 2 的 10 次方
console.log(1 << 10);
// 获得 2 的 24 次方
console.log(1 << 24);
2. 使用异或运算符 ^ 切换变量 0 或 1
在数学中,^ 代表幂运算,但在位运算中,它代表异或运算。
我们用 10 和 12 来演示异或运算。
异或运算规则为:相同为 0 ,不同为 1 。
第一行为数字 10 转化的二进制,第二行为数字 12 转化的二进制,红色框中符号位。
进行异或运算时,紫色框外 (含符号位) 的位全部相同 ,所以异或后这些位得到 0 。
紫色框内的位上不同,它们异或得到一个 1 。
因此,第三行为数字 10 与数字 12 异或运算后的二进制。值为 6 。我们来验证一下
console.log(10 ^ 12);
如果我们需要重复改变为 0 和 1 ,就不再需要用 if 条件语句或者三目运算符了。
let a = 0;
a ^= 1;
console.log(a);
a ^= 1;
console.log(a);
a ^= 1;
console.log(a);
3. 使用按位与运算符 & 判断数值奇偶性
类似 if 语句中的逻辑与 && ,&& 前后都为 true 时,返回 true 。
按位与 & 只有前后都为 1 时,才返回 1 ,否则得到 0 。
我们还是以 10 和 12 来演示
![](https://i-blog.csdnimg.cn/blog_migrate/a7366d073f6ae535e97dda6ba4111b9c.png)
在 10 和 12 转化成的二进制中,只有紫色框中这一位同为 1 ,其他位均包含 0 。
所以按位与之后,其他位 (包括符号位) 均得到 0 。最终结果为第三个二进制串,它代表十进制的 8 。验证如下
console.log(10 & 12);
在二进制中,偶数的最后一位一定为 0 ,奇数的最后一位一定为 1 。
我们可以判断二进制最后一位,来得知这个数值的奇偶性。
console.log(7 & 1);
console.log(8 & 1);
console.log(22 & 1);
console.log(51 & 1);
4. 使用双逻辑非 !! 快捷转为布尔值
逻辑非 ! 在条件判断中十分常见,它能够将布尔类型的两个值互相转换。
另外,建议先阅览 JavaScript 中的隐式类型转换
我们通过两次逻辑非运算,可以快速将某个值转化为对应的布尔值。
console.log(!!123)