電腦以二進位儲存資料。32 位元系統下,整數佔 4 bytes (32 bits)。位元運算直接操作二進位位元,屬 CPU 指令級運算,速度極快 (通常 1 CPU cycle),比乘除法快數倍。雖然現代編譯器會自動優化 (如 x * 2 → x << 1),但在特定場景手寫位元運算仍有價值。
| 運算子 | 名稱 | 規則 | 範例 (十進位 → 二進位 → 結果) |
|---|---|---|---|
<< |
左移 | 向左位移 n 位,低位補 0,高位捨棄。等同 × 2ⁿ |
3 << 2 → 0011 → 1100 = 12 (3×4) |
>> |
右移 | 向右位移 n 位,無符號數高位補 0,有符號數高位複製符號位 (算術右移)。等同 ÷ 2ⁿ (向零取整) |
24 >> 2 → 11000 → 00110 = 6 (24÷4) |
& |
按位與 | 同為 1 結果為 1,否則 0。常用:遮罩、檢查旗標、取模 (2ⁿ-1) | 5 & 6 → 0101 & 0110 = 0100 = 4 |
| |
按位或 | 任一為 1 結果為 1。常用:設定旗標、合併權限位元組 | 5 | 6 → 0101 | 0110 = 0111 = 7 |
^ |
按位異或 | 相異為 1,相同為 0。常用:切換旗標、無暫存變數交換、簡易加密、校驗和 | 5 ^ 6 → 0101 ^ 0110 = 0011 = 3 |
~ |
按位非 (取反) | 0→1, 1→0。有符號整數會改變符號位。~x === -x - 1 |
~5 → ...11111010 = -6 (有符號 32-bit) |
<?php
// 定義權限常數 (冪次方,二進位僅一個 1)
class Permission {
public const READ = 1 << 0; // 1 = 0001
public const WRITE = 1 << 1; // 2 = 0010
public const EXEC = 1 << 2; // 4 = 0100
public const ADMIN = 1 << 3; // 8 = 1000
public const ALL = self::READ | self::WRITE | self::EXEC | self::ADMIN; // 15 = 1111
}
$userPerm = Permission::READ | Permission::WRITE; // 3 = 0011
// 檢查權限
function hasPermission(int $userPerm, int $required): bool {
return ($userPerm & $required) === $required;
}
var_dump(hasPermission($userPerm, Permission::READ)); // true
var_dump(hasPermission($userPerm, Permission::ADMIN)); // false
// 新增/移除權限
$userPerm |= Permission::EXEC; // 設定 EXEC 位 → 7 (0111)
$userPerm &= ~Permission::WRITE; // 清除 WRITE 位 → 5 (0101)
$userPerm ^= Permission::ADMIN; // 切換 ADMIN 位 → 13 (1101)
?>
$x % $n 若 $n 為 2 的冪次方,可用 $x & ($n - 1) 替代。
應用:環狀緩衝區索引、哈希表桶位計算、記憶體對齊檢查。
<?php $capacity = 1024; // 2^10 $index = $hash & ($capacity - 1); // 等同 $hash % 1024,但快數倍 ?>
<?php $a = 10; $b = 20; $a ^= $b; // a = 10^20 = 30 $b ^= $a; // b = 20^30 = 10 $a ^= $b; // a = 30^10 = 20 // 現代 PHP 直接用 [$a, $b] = [$b, $a] 更易讀,但此技巧在嵌入式/底層仍常用 ?>
<?php $color = 0xFF336699; // ARGB: Alpha=FF, Red=33, Green=66, Blue=99 $alpha = ($color >> 24) & 0xFF; // 255 $red = ($color >> 16) & 0xFF; // 51 $green = ($color >> 8) & 0xFF; // 102 $blue = $color & 0xFF; // 153 // 組合新顏色 $newColor = ($alpha << 24) | ($red << 16) | ($green << 8) | $blue; ?>
<?php $n & 1 // 1=奇數, 0=偶數 (比 $n % 2 快) ($n & ($n - 1)) === 0 // 判斷是否為 2 的冂次方 (n>0) ?>
<?php
function xorChecksum(string $data): int {
$checksum = 0;
for ($i = 0; $i < strlen($data); $i++) {
$checksum ^= ord($data[$i]);
}
return $checksum; // 0-255
}
// 傳輸時附加 checksum,接收端重算驗證完整性
?>
PHP_INT_SIZE (4 或 8)、PHP_INT_MAX、PHP_INT_MIN。float (可能精度損失)。float 會被截斷。>> 為算術右移 (保留符號位),若需邏輯右移 (無符號) 需自行處理:($n >> $shift) & ((1 << (PHP_INT_SIZE*8 - $shift)) - 1)。| 操作 | 耗時 (秒) | 備註 |
|---|---|---|
$a * 2 | 0.12 | JIT 優化後極快 |
$a << 1 | 0.11 | 略快 |
$a % 1024 | 0.18 | 除法指令較慢 |
$a & 1023 | 0.09 | 位元與最快 |
$a ^ $b | 0.10 |
結論:現代 PHP (8.0+ JIT) 已大幅縮小差距,但在高頻迴圈、大量資料處理 (圖像、加密、壓縮、網路協定解析) 中,位元運算仍具優勢。
// 檢查 READ 權限位)。Permission::READ, hasPermission(),隱藏位元細節。% 2、* 2、in_array() 等可讀性更高的寫法。位元運算是貼近硬體的高效工具,掌握「遮罩檢查、旗標設定、快速取模、資料壓縮」等核心模式,能在系統底層、高效能運算、網路協定、加密演算法等領域發揮關鍵作用。PHP 開發者雖較少直接接觸,但理解其原理有助於閱讀底層庫源碼、優化關鍵路徑、面試底層知識考察。