Mặt nạ bit quyền được hiểu rõ nhất khi được biểu diễn dưới dạng nhị phân, với mỗi chữ số đại diện cho một quyền được bật hoặc tắt. Vì vậy, nếu các quyền X, Y và Z tồn tại và tôi chỉ có quyền truy cập vào X và Z, 101
sẽ tuyên bố rằng tôi có quyền đầu tiên và quyền thứ ba được cấp cho tôi, nhưng không phải quyền thứ hai. Số nhị phân 101
tương đương với số thập phân 5
, vì vậy đó là những gì cuối cùng sẽ được lưu trữ trong cơ sở dữ liệu. Một số nguyên nhỏ là đối tượng lưu trữ hiệu quả hơn nhiều so với một chuỗi hoặc một số số nguyên nhỏ.
CHỈNH SỬA: Tôi nhận ra rằng việc tận dụng các chức năng chuyển đổi hiện có dễ dàng như thế nào để tiến hành triển khai khá nhanh chóng. Đây là một mẫu.
<?php
function bitmask_expand($n) {
// 9 returns array(1, 0, 0, 1)
return str_split(base_convert($n, 10, 2));
}
function bitmask_compact($a) {
// array(1, 0, 0, 1) returns 9
return (int) base_convert(implode($a), 2, 10);
}
$ns = range(0, 7);
foreach($ns as $n) {
print_r($b = bitmask_expand($n));
echo bitmask_compact($b), "\n\n";
}
Bạn có thể nhận được hiệu suất tốt hơn nếu bạn sử dụng các vòng lặp, thay vì kéo ngược lại các chuỗi, nhưng điều này minh họa nguyên tắc khá rõ ràng.