php 位运算符
在 PHP 中,位运算符用于对整数的二进制形式进行逐位操作。这些运算符直接操作数字的二进制位,因此可以用来实现一些高效的算法或优化操作。
以下是 PHP 支持的主要位运算符及其功能:
---
### 1. **按位与 (`&`)**
- 将两个操作数的每一位进行比较,如果两个对应的二进制位都为 `1`,则结果的对应位为 `1`;否则为 `0`。
- 示例:
```php
$a = 5; // 二进制:0101
$b = 3; // 二进制:0011
echo $a & $b; // 输出:1 (二进制:0001)
```
---
### 2. **按位或 (`|`)**
- 将两个操作数的每一位进行比较,如果任意一个对应的二进制位为 `1`,则结果的对应位为 `1`;否则为 `0`。
- 示例:
```php
$a = 5; // 二进制:0101
$b = 3; // 二进制:0011
echo $a | $b; // 输出:7 (二进制:0111)
```
---
### 3. **按位异或 (`^`)**
- 将两个操作数的每一位进行比较,如果两个对应的二进制位不同,则结果的对应位为 `1`;否则为 `0`。
- 示例:
```php
$a = 5; // 二进制:0101
$b = 3; // 二进制:0011
echo $a ^ $b; // 输出:6 (二进制:0110)
```
---
### 4. **按位取反 (`~`)**
- 对操作数的每一位取反(即 `0` 变成 `1`,`1` 变成 `0`)。
- 注意:PHP 使用补码表示负数,因此结果可能与预期不同。
- 示例:
```php
$a = 5; // 二进制:0101
echo ~$a; // 输出:-6
```
---
### 5. **左移 (`<<`)**
- 将操作数的二进制位向左移动指定的位数,并在右侧补零。
- 示例:
```php
$a = 5; // 二进制:0101
echo $a << 1; // 输出:10 (二进制:1010)
```
---
### 6. **右移 (`>>`)**
- 将操作数的二进制位向右移动指定的位数,并根据符号位决定左侧补什么值(对于无符号数补零,对于有符号数补符号位)。
- 示例:
```php
$a = 10; // 二进制:1010
echo $a >> 1; // 输出:5 (二进制:0101)
```
---
### 7. **零填充右移 (`>>>`)**
- 将操作数的二进制位向右移动指定的位数,并在左侧补零(无论符号位如何)。
- 注意:PHP 的右移运算符 (`>>`) 是有符号右移,而 `>>>` 是零填充右移。但在 PHP 中没有显式的 `>>>` 运算符,可以通过其他方式实现。
- 示例:
```php
$a = -10; // 二进制:11111111111111111111111111110110
echo $a >> 1; // 输出:-5
```
---
### 实际应用场景
1. **掩码操作**:通过按位与 (`&`) 和按位或 (`|`) 来设置或清除特定的标志位。
```php
$flags = 0;
$flags |= 1; // 设置第 0 位
$flags |= 2; // 设置第 1 位
$flags &= ~1; // 清除第 0 位
```
2. **快速幂运算**:利用位运算实现快速幂计算。
```php
function fastPow($base, $exp) {
$result = 1;
while ($exp > 0) {
if ($exp & 1) { // 检查最低位是否为 1
$result *= $base;
}
$base *= $base;
$exp >>= 1; // 右移一位
}
return $result;
}
```
3. **位掩码优化存储**:用一个整数存储多个布尔值。
```php
$status = 0;
$status |= 1 << 0; // 设置第 0 位
$status |= 1 << 1; // 设置第 1 位
if ($status & (1 << 0)) { // 检查第 0 位是否被设置
echo "第 0 位已设置";
}
```
---
### 总结
位运算符在某些场景下可以显著提高程序性能,特别是在需要处理低级数据结构或优化内存使用时。熟练掌握这些运算符的使用方法和特性,可以帮助开发者写出更高效、更简洁的代码。