原理
在Linux文件系統中,一個用戶對文件或目錄所擁有的權限分為三種:”可讀”、”可寫”和”可執行”,分別用 1 、2 和 4 來表示,它們之間可以任意組合:有“可讀”、“可寫”權限就用 3 來表示(1 + 2 = 3);有”可讀“、”可執行“權限就用5來表示(1 + 4 = 5),三種權限全部擁有就用 7 表示(1 + 2 + 4 = 7)。
實際上,這種運算是基於二進制的。
假設可執行、可寫、可讀三種權限分別對應三個狀態位,如果用戶具有某種權限,那么將對應的狀態位標識為“1”,反之則標識為“0”。如圖:
如果只有“可讀”權限,那么就對應二進制數:001,將這個二進制數轉成十進制就得到1;如果同時具有“可讀”、“可寫”權限,二進制數則對應為: 011,轉十進制得:3;同理,三種權限都有的,十進制就等於7。
實現
在PHP中,通過位運算符很容易就可以做到類似的權限控制:
<?php //定義權限 define('READ', 1<< 0); // 把可讀權限放在最右邊 define('WRITE', 1<<1); // 可讀權限向左移一位 define('EXCUTE', 1<<2); // 可執行權限向左移兩位 //賦予權限 $user_permission = READ | WRITE; //驗證權限 echo '可讀:', ($user_permission & READ) ? 'Yes' : 'No', "\n"; echo '可寫:', ($user_permission & WRITE) ? 'Yes' : 'No', "\n"; echo '可執行:', ($user_permission & EXCUTE) ? 'Yes' : 'No', "\n"; ?>
PHP語言本身的錯誤控制 也是用位運算來做的,它甚至還利用了按位異或和按位非,使得錯誤控制更加精確。
優點和缺陷
位運算的運算對象是二進制的位,速度快,效率高,而且節省存儲空間,位運算做權限控制又相當地靈活。但是,位運算也有很大的局限,因為在32位計算機上,位移不能超過32次,這就要求權限數量不超過32種。
延伸閱讀: