在JavaScript中,按位运算符主要用于对整数(32位二进制数)的二进制表示进行直接操作。它们通常用于性能敏感的场景,比如图形处理、数据加密等。以下是几种常见的按位运算符及其简要解析:
1. **按位与(AND)** - `&`
- 对两个数的每一位执行逻辑与操作。只有两个位都为1时,结果位才为1。
- 用途:清零特定位、检查位是否被设置。
- 示例:`let a = 5; // 101, let b = 3; // 011, let c = a & b; // 001, c = 1;`
2. **按位或(OR)** - `|`
- 对两个数的每一位执行逻辑或操作。只要有一个位为1,结果位就为1。
- 用途:设置特定位。
- 示例:`let a = 5; // 101, let b = 8; // 1000, let c = a | b; // 1001, c = 9;`
3. **按位异或(XOR)** - `^`
- 对两个数的每一位执行逻辑异或操作。当两个位不同时,结果位为1。
- 用途:切换位(0变1,1变0)、无进位加法。
- 示例:`let a = 5; // 101, let b = 2; // 010, let c = a ^ b; // 111, c = 7;`
4. **按位非(NOT)** - `~`
- 对一个数的每一位执行逻辑非操作。0变1,1变0。
- 注意:结果会取反后对所有位进行补码表示,因此结果是一个负数(如果原数是正数),或者是一个特殊的负数(如果原数是0或负数)。
- 示例:`let a = 5; // 00000101, let b = ~a; // 11111010(作为补码表示-6)`
5. **左移(Left Shift)** - `<<`
- 将数的所有位向左移动指定的位数,右边超出的位被丢弃,左边新增的位用0填充。
- 用途:快速乘以2的幂。
- 示例:`let a = 5; // 101, let b = a << 2; // 10100, b = 20;`
6. **有符号右移(Signed Right Shift)** - `>>`
- 将数的所有位向右移动指定的位数,左边超出的位被丢弃。对于正数,左边新增的位用0填充;对于负数,则根据符号位(最左边的位)用1填充。
- 用途:快速除以2的幂(考虑符号)。
- 示例:`let a = -5; // 补码表示 11111011, let b = a >> 2; // 11111101(补码表示-2)`
7. **无符号右移(Unsigned Right Shift)** - `>>>`
- 与有符号右移类似,但无论数的符号如何,左边新增的位总是用0填充。
- 用途:处理无符号整数或需要忽略符号位的场景。
- 示例:`let a = -5; // 补码表示 11111011, let b = a >>> 2; // 00111110(十进制为62)`
按位运算符通常用于底层操作,它们直接操作数的二进制表示,因此在处理大量数据或需要直接控制内存位时非常有用。然而,由于它们直接操作内存表示,因此在编写代码时需要特别小心,以避免意外的行为。