Каков наилучший способ преобразовать целое число с двоичными данными в последовательность логических значений? - PullRequest
1 голос
/ 03 февраля 2012

У меня есть данные, хранящиеся в SQL как целое число от 0 до 63, т.е. шесть битов IE. Я пытаюсь выполнить (или нет) 6 простых операторов на основе соответствующих битовых значений.

Я хочу знать, какой метод является наиболее эффективным, или, возможно, если я делаю свою жизнь намного сложнее, чем она должна быть (что я подозреваю, правда).

Метод 1:

Цикл, работающий от самого маленького до самого большого. Разделите целое число на 2, если не целое число, то вычтите .5 и первый бит верен. Повторяйте до тех пор, пока значение не станет равным нулю.

Метод 2:

Преобразование в двоичный код, заполнение начальными нулями, затем чтение каждого символа выходной строки. (множество функций и преобразований типов.)

    $bit = str_pad(decbin($row['utilities']),6,"0", STR_PAD_LEFT)

Метод 3:

Цикл, работающий от самого большого до самого маленького. Если целое число больше 32, то вычтите 32, и последний бит равен true. Разделите контрольную цифру на 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>

Ответы [ 3 ]

2 голосов
/ 03 февраля 2012

Мой совет: Для этого используйте битовый оператор вместо 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, но, по моему опыту, это обычно делает ваш код длиннее и не так хорош, как читаемый.

1 голос
/ 03 февраля 2012

Использовать битовые операторы :

$bits = array();
for ($i = 0; $i < 6; $i++) {
    $bits[$i] = (boolean)( $number & (1 << $i) );
}
1 голос
/ 03 февраля 2012

извлеките спецификатор формата% b для sprintf .что вам нужно сделать, это

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