JS: 位运算

参考地址: 这么骚的 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 来演示

在 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)
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript 中,位运算使用以下语法: 1. 按位与(AND):使用 `&` 运算符。它对两个操作数的每个对应位执行逻辑 AND 操作,并返回结果。例如: ```javascript const result = 5 & 3; // 1 ``` 在上述示例中,`5` 的二进制表示为 `101`,`3` 的二进制表示为 `011`,按位与运算后,得到二进制 `001`,即十进制的 `1`。 2. 按位或(OR):使用 `|` 运算符。它对两个操作数的每个对应位执行逻辑 OR 操作,并返回结果。例如: ```javascript const result = 5 | 3; // 7 ``` 在上述示例中,`5` 的二进制表示为 `101`,`3` 的二进制表示为 `011`,按位或运算后,得到二进制 `111`,即十进制的 `7`。 3. 按位异或(XOR):使用 `^` 运算符。它对两个操作数的每个对应位执行逻辑 XOR 操作,并返回结果。例如: ```javascript const result = 5 ^ 3; // 6 ``` 在上述示例中,`5` 的二进制表示为 `101`,`3` 的二进制表示为 `011`,按位异或运算后,得到二进制 `110`,即十进制的 `6`。 4. 按位非(NOT):使用 `~` 运算符。它对操作数的每个位执行逻辑 NOT 操作,并返回结果。例如: ```javascript const result = ~5; // -6 ``` 在上述示例中,`5` 的二进制表示为 `00000000000000000000000000000101`,按位非运算后,得到二进制 `11111111111111111111111111111010`,即十进制的 `-6`。 需要注意的是,位运算符操作的是操作数的每个位,因此操作数通常是整数类型。如果操作数不是整数,JavaScript 会在进行位运算之前将其转换为整数。 希望以上信息对你有所帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值