Побитовый оператор И не работает должным образом

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

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

Когда я использую php, я пытаюсь использовать его как MySQL match:

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

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

1

Решение

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

Теперь, если оба операнда побитовое И оператором являются строки, операция выполняется с Значения ASCII из строк.

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

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

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

Давайте возьмем второе утверждение if:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]