2015-04-08 2 views
1

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

  • 1 = разблокировать название
  • 2 = разблокировать убывание
  • 4 = разблокирование цена
  • 8 = разблокировать запас

Когда я использую PHP Я пытаюсь использовать его как матч MySQL:

$overwirtes = 5; 

if (decbin($overwirtes) & decbin(1)) 
{ 
    // unlock title 
} 

if (decbin($overwirtes) & decbin(2)) 
{ 
    // unlock desc 
} 

if (decbin($overwirtes) & decbin(4)) 
{ 
    // unlock price 
} 

if (decbin($overwirtes) & decbin(8)) 
{ 
    // unlock stock 
} 

Что я ожидаю, что это название и цена разблокированы, а de sc и запасы блокируются, но что-то не так, и php не будет принимать двоичные файлы, как MySQL, может кто-нибудь сказать мне, что я делаю неправильно здесь, я все еще новичок в работе над двоичным кодом как правила.

+0

Что такое код в если заявления? – Rizier123

+0

его массив вроде (1 или 0) его единственный, чтобы проиллюстрировать мою проблему, :) – ParisNakitaKejser

+0

Удалите 'decbin()' вызовы от 1,2,4,8, и все должно работать нормально – Rizier123

ответ

2

Вы столкнулись с «смешной» проблемой. И это то, что decbin() возвращает строку.

Теперь, если оба операнда оператора bitwise AND являются строками, операция выполняется с помощью строчек ASCII values.

Также цитата из руководства, которое показывает, что это тоже:

Если оба операнда для &, | и^операторы являются строками, то операции будет выполняться на ASCII значения из символов, которые составляют строки и результат будет строкой. В во всех остальных случаях, оба операнда будут преобразованы в целые числа и результата будет целым числом.

Так что это значит в вашем конкретном примере?

Давайте взять второй, если заявление:

$overwirtes = 5; 
decbin($overwirtes) & decbin(2) 

Ну технические это должно быть оценено как следует:

0000 0101 (5) 
0000 0010 (2) 
---------- & 
0000 0000 = 0 (FALSE) 

Но поскольку оба операнды строки побитовое И принимает значения ASCII из обе строки, которые были бы следующими:

0011 0101 (53) 
0011 0010 (50) 
---------- & 
0011 0000 = "48" (TRUE) 

Вот почему все условия в вашем коде оцениваются как ИСТИНА.


Но теперь, как решить эту проблему? Просто, просто измените 1 операнд операции на целое. Таким образом, вы можете просто удалить вызов decbin() с 1, 2, 4, 8.

Вы также можете увидеть в руководстве (цитата выше), когда 1 операнд не является строкой (здесь целое число), которое оба операнда получают неявным приведение к целому числу. И вы также получаете целое число.

Так что ваш код должен выглядеть следующим образом:

$overwirtes = 5; 

if (decbin($overwirtes) & 1) 
{ 
    // unlock title 
} 

if (decbin($overwirtes) & 2) 
{ 
    // unlock desc 
} 

if (decbin($overwirtes) & 4) 
{ 
    // unlock price 
} 

if (decbin($overwirtes) & 8) 
{ 
    // unlock stock 
} 
+0

Большое спасибо за это дружеское объяснение, теперь я понимаю, но все-таки путаюсь с PHP. Не конвертируй его в «bin», когда я это скажу, но то, что вы говорите, его работа, как я закрыл, настолько совершенна, спасибо большое :) – ParisNakitaKejser

+0

Doesn Это означает, что '$ overwirtes' будет преобразован обратно в целое число, интерпретируя его биты как * десятичные * цифры? Это было бы очень неправильно. Зачем конвертировать его в строку в первую очередь? – harold

+0

@ParisNakitaKejser Добро пожаловать! – Rizier123

Смежные вопросы