将带有二进制数据的整数转换为一系列bolean的最佳方法是什么


What is the best way to convert an integer with binary data to a series of boleans?

我在SQL中存储的数据是0到63之间的整数,IE为六位。我正在尝试基于各自的位值执行(或不执行)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之间的数字(包括0和63))创建用于存储在SQL数据库中的数据的form元素除了php之外是相同的。

    $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>

我的建议:为此,使用逐位运算符来代替decbin等。这不仅使它更容易,而且还清理了大量代码。

语法:

if($yourstoragebytes & $bittocheckfor) {
    // do something
}

以下是php手册中的一个精彩示例:

$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中这样做,但根据我的经验,这通常会让你的代码更长,可读性也不如。

使用位运算符:

$bits = array();
for ($i = 0; $i < 6; $i++) {
    $bits[$i] = (boolean)( $number & (1 << $i) );
}

签出sprintf的%b格式说明符。你需要做的是

$bit = sprintf("%06b",$value_from_db);