Bitmask izin paling baik dipahami ketika direpresentasikan sebagai biner, dengan setiap digit mewakili izin yang aktif atau nonaktif. Jadi jika izin X, Y, dan Z ada, dan saya hanya memiliki akses ke X dan Z, 101
akan menyatakan bahwa saya memiliki izin pertama dan ketiga yang diberikan kepada saya, tetapi bukan yang kedua. Bilangan biner 101
setara dengan angka desimal 5
, jadi itulah yang akhirnya disimpan dalam database. Satu bilangan bulat kecil adalah objek yang jauh lebih efisien untuk disimpan daripada string atau beberapa bilangan bulat kecil.
EDIT: Saya menyadari betapa mudahnya memanfaatkan fungsi konversi yang ada untuk mendapatkan implementasi yang cukup cepat. Ini contohnya.
<?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";
}
Anda mungkin mendapatkan kinerja yang lebih baik jika menggunakan loop, daripada menarik kembali ke dan dari string, tetapi ini menggambarkan prinsip dengan cukup jelas.