Я использую двоичный код для обработки своих перезаписей в своей базе данных, но теперь мне нужно посмотреть, соответствуют ли правила или не соответствуют этим, у меня есть следующие правила.
Когда я использую 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, может кто-нибудь сказать мне, что я делаю не так, я все еще новичок в работе над двоичным кодом, так как правила.
Вы сталкиваетесь с «забавной» проблемой. И это то, что 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
}
Других решений пока нет …