2013-02-21 4 views
1

Признаюсь, я не знаю, что я делаю! Я вытаскиваю некоторые данные из SecondLife и разбираюсь в PHP. Данные представляют собой целое число от llGetRegionFlags, которое в моем случае возвращает 1048592Поразрядное сравнение в PHP

Теперь мне нужно поразрядное сравнение в PHP, чтобы выяснить, какие флаги являются true/false. Например, для флага «block terraform» используется 0x00000040.

Обозначения в шестнадцатеричном виде для каждого флага, и у меня есть целое число для проверки, а PHP manual предлагает целые числа и показывает примеры в двоичном формате.

Таким образом, мой вопрос действительно задан как целое число и некоторые шестнадцатеричные флаги, как мне сделать побитовое сравнение в PHP? Brainfried! Заранее спасибо

ответ

1

Чтобы определить, является ли конкретный бит включен, используйте (AND) оператор & :

if ($data & 0x00000040) { 
    // block terraform flag is true 
} 

Если бит включен, оператор И возвращает позити ve число. Если он выключен, то оператор И приведет к нулю.

+0

Ага спасибо! Я не понимал, что могу сравнить шестнадцатеричное значение с целым числом или как использовать шестнадцатеричную нотацию в PHP. Просто, когда вы знаете, как! – Tak

0

Использование одного и &/ИЛИ |

if ($value1 & $value2) { } 

Руководство по PHP объясняет больше: http://php.net/manual/en/language.operators.bitwise.php

+0

Благодаря mcryan, извините Джеймс пробита вам на почту! Я попробовал руководство, но не понял, что могу сравнить hex с целым числом и т. Д. – Tak

0

Вы можете определить требуемые бит и проверить их, чтобы они выглядели чистыми. IE

define('BLOCK_TERAFORM', 0x00000040); 

.... 

if($data & BLOCK_TERAFORM) { 
    ... do something ... 
} 
+0

Спасибо, hexblot отличная идея, держит ее в чистоте – Tak

0

Обычно bitflags проверяются с куском кода:

$blockTerraformFlag = 0x00000040; 
$isBlockTerraform = (($RegionFlags & $blockTerraformFlag) == $blockTerraformFlag);