本文深入解析JavaScript中的按位运算符,包括与、或、异或、取反及移位操作。通过二进制原理说明其工作机制,并展示如何利用左移实现快速乘除、右移取整以及异或运算符进行无需临时变量的数值交换,帮助开发者在脚本语言中更高效地处理底层数据操作。
JavaScript按位运算符概述
多数编程语言都内置了按位运算符,这类运算符在C、C++等系统级语言中应用广泛,但在JavaScript、ActionScript等脚本语言中相对少见。然而,在特定场景下合理运用按位运算符,往往能带来意想不到的优化效果。下文将结合个人理解,简要介绍JavaScript中的位操作方法(其原理同样适用于其他语言),若有疏漏之处,欢迎指正。
按位运算符将操作数视为一系列独立的二进制位,而非单纯的数值。因此,理解“位”的概念至关重要:在计算机内存中,数值或字符均以0和1的序列形式存储,每一个0或1被称为一个“位”。例如,十进制数2在内存中表示为 0 0 0 0 0 0 1 0。当改变这些位的值时,其所代表的意义也会随之变化。比如将2的二进制表示左移一位,变为 0 0 0 0 0 1 0 0,此时其十进制值变为4。这就是按位操作符的基本运算原理。
六大按位运算符详解
JavaScript中主要包含6种按位运算符: & 按位与(Bitwise AND) | 按位或(Bitwise OR) ^ 按位异或(Bitwise XOR) ~ 按位取反(Bitwise NOT) >> 右移(Right Shift) << 左移(Left Shift)
1. & 运算符 & 是一个二元运算符,它通过特定规则组合两个操作数中对应的位:如果对应位均为1,则结果位为1;只要任意一个操作数的对应位为0,结果位即为0。 以 1 & 3 为例,结果为 1。 具体运算过程如下: 1 的二进制表示为 0 0 0 0 0 0 1 3 的二进制表示为 0 0 0 0 0 1 1 根据 & 的规则进行逐位比较,得到的结果为 0 0 0 0 0 0 0 1,即十进制的 1。
只要任何一位是0 &运算的结果就是 0,所以可以用&把某个变量不必要的位设为0, 比如某个变量的二进制表示为 0 1 0 0 1 0 0 1, 我想保留低4位,消除高4位 用 & 0x0F就可以了(住:0x0F为16进制表示法,对应的二进制为 0 0 0 0 1 1 1 1),这个特性有个很重要的应用,在后面会提到。
2. | 运算符 | 运算符与 & 的区别在于:只要对应的位中任意一个操作数为1,结果位即为1。 例如,1 | 3 的结果为 3。
3. ^ 运算符 ^ 运算符与 | 类似,但关键区别在于:如果两个操作位都为1,则结果位为0;否则为1。 示例运算: 操作数1:0 1 0 0 0 0 0 1 操作数2:0 1 0 1 1 0 1 0 结果: 0 0 0 1 1 0 1 1
4. ~ 运算符 ~ 是单目运算符,用于对位进行求反,即把1变为0,把0变为1。
5. 移位运算符 移位运算符将位序列按指定的位数向左或向右移动。<< 表示左移,>> 表示右移。在移位过程中,移出的位将被丢弃,而空出的高位或低位则补0。
例如,二进制数 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1(十进制16387): 向左移动两位后变为 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0(十进制12); 向右移动两位后变为 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0(十进制4096)。
按位运算符的实际应用
下面介绍一些具体的应用场景。 前文提到,数值向前移动1位相当于乘以2,利用这一特性可以进行快速乘法运算: 2 << 1 = 4 3 << 1 = 6 4 << 1 = 8 同理,右移运算(>>)可用于实现快速除法。
对于任何小数,将其右移0位(>> 0)即可实现取整效果。 例如:3.14159 >> 0 = 3。
^ 运算符还有一个有趣的特性,可用于在不使用临时变量的情况下交换两个变量的值。具体代码如下:
代码如下:
<script>
var n1 = 3;
var n2 = 4;
n1 ^= n2;
n2 ^= n1;
n1 ^= n2;
</script>