将二进制数据整数转换为一系列布尔值的最佳方式是什么?

问题描述:

我有数据存储在SQL中作为0和63之间的整数,IE 6位。 我试图执行(或不)6基于各自的位值简单的陈述。将二进制数据整数转换为一系列布尔值的最佳方式是什么?

我想知道哪种方法是最有效的,或者如果我让我的生活比它必须更难(我怀疑是真的)。方法1:

方法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之间的数字)创建用于存储在SQL数据库中的数据的表单元素除了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> 

我的建议是: 对于这种使用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这样做了,但是从我的经验,这往往使你的代码较长,没有那么好为可读。

+0

我可以理解这一点,它似乎最适合我的项目。谢谢! 我怀疑for循环在更多情况下效率更高,但是因为我想要做的就是检查true/false,这不会浪费任何东西。 – 2012-02-03 18:37:37

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

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

这应该是''%06b''以确保包含前导零位。还要注意,结果字符串将具有“倒序”的位,即最重要的位在先。 – 2012-02-03 18:14:25

+0

谢谢,我会编辑我的答案 – Bogdan 2012-02-03 18:14:43

使用bitwise operators

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