我将数据存储在SQL中,为0到63之间的整数,IE为6位。 我试图根据各自的位值执行(或不执行)6个简单语句。
我想知道哪种方法效率最高,或者可能是因为我的生活比以前更难(我怀疑这是真的)。
方法1:
循环工作从最小到最大。将整数除以2,如果不是整数,则减去.5,第一位为真。重复,直到值为零。
方法2:
转换为二进制,使用前导零填充,然后读取输出字符串的每个字符。 (许多功能和类型转换。)
$bit = str_pad(decbin($row['utilities']),6,"0", STR_PAD_LEFT)
方法3:
循环工作从最大到最小。如果整数大于32,则减去32,最后一位为真。将测试数字除以2并重复直到测试0.5。
这是我正在使用的代码。 (其中$ row ['utilities']从SQL输出并包含0到63之间的数字)除了php之外,在SQL数据库中创建存储数据的表单元素是相同的。
$bit = ???
<select name="ut[]" multiple="multiple" class="postSelect">
<option <?php if ($row['utilities']==0) {echo "selected='selected'";}?> value="0">None</option>
<option <?php if (bit['0']) {echo "selected='selected'";}?> value="1">Electricity</option>
<option <?php if (bit['1']) {echo "selected='selected'";}?> value="2">Water</option>
<option <?php if (bit['2']) {echo "selected='selected'";}?> value="4">Heat</option>
<option <?php if (bit['3']) {echo "selected='selected'";}?> value="8">Phone</option>
<option <?php if (bit['4']) {echo "selected='selected'";}?> value="16">Internet</option>
<option <?php if (bit['5']) {echo "selected='selected'";}?> value="32">Laundry</option>
</select>
答案 0 :(得分:2)
我的建议:
为此,请使用bitwise operator代替decbin
等。这使得它不仅更容易,而且清理了很多代码。
语法:
if($yourstoragebytes & $bittocheckfor) {
// do something
}
这是一个很好的例子from the php manual:
$writePost = 1;
$readPost = 2;
$deletePost = 4;
$addUser = 8;
$deleteUser = 16;
// User groups:
$administrator = $writePost | $readPosts | $deletePosts | $addUser | $deleteUser;
$moderator = $readPost | $deletePost | $deleteUser;
$writer = $writePost | $readPost;
$guest = $readPost;
// function to check for permission
function checkPermission($user, $permission) {
if($user & $permission) {
return true;
} else {
return false;
}
}
// Now we apply all of this!
if(checkPermission($administrator, $deleteUser)) {
deleteUser("Some User"); # This is executed because $administrator can $deleteUser
}
您也可以在MySQL中执行此操作,但根据我的经验,这通常会使您的代码更长,而且不如可读。
答案 1 :(得分:1)
签出sprintf的%b格式说明符。你需要做的是
$bit = sprintf("%06b",$value_from_db);
答案 2 :(得分:1)
$bits = array();
for ($i = 0; $i < 6; $i++) {
$bits[$i] = (boolean)( $number & (1 << $i) );
}