У меня есть проблема с битовой операцией AND для двух переменных, когда я использую переменные, такие как приведенные ниже, возвращают правильные результаты, для «lock» = 1, open = 0
$ACRel = "00000000000000000000010000000000";
// $STS = "11000000011100000000"; //788224 locked
$STS = "11000000001100000000"; //787200 open
echo (is_numeric($STS)&is_numeric($ACRel)); // return 1 or 0
я получил переменную $ STS в десятичном формате, и я использую функцию decbin () для преобразования:
$ACRel = "00000000000000000000010000000000";
// $sts = decbin(788224);
$sts = decbin(787200); // return 11000000001100000000
echo (is_numeric($sts)&is_numeric($ACRel));
И теперь я всегда возвращаю 1, decbin в echo возвращает одно и то же значение, но когда я использую var_dump, у меня есть:
$sts = "11000000001100000000";
/home/vagrant/code/project/pro/calc.php:8:string '11000000001100000000' (length=26)
$sts = decbin(788224);
/home/vagrant/code/project/pro/calc.php:12:string '11000000001100000000' (length=20)
Почему длина отличается, строки выглядят одинаково? может быть это ответ? но я не знаю почему.
В связи с проблемой, которую вы описываете, я вижу здесь две проблемы.
Первая проблема, которую я вижу, состоит в том, чтобы применить операцию AND для побитовых переменных к описанным переменным значениям.
Но проблема в том, что вы применяя битовое AND к логическому выходу метода is_number. Это означает, что вы всегда получите 1, если они правильные числа.
Решение здесь заключается в том, что вы должны применять после приведения строки как int: intval.
Вторая проблема, которую я вижу здесь, в первом примере — содержание этой переменной содержит не числовые значения:
$STS = "11000000001100000000"; //787200 open
Есть некоторые символы, которые не видны, но если вы проверите с помощью инспектора инструментов ASCII, вы можете увидеть его: посмотрите Вот а также Вот и скопировать значение этой переменной, вы увидите, что содержит не числовые числа:
11000000001100000000U+202C
Итак, метод is_numeric возвращает ложь, потому что не распознает эту строку как числовой для этого не числового (не видимого) значения. И это причина, почему в первом примере вы получаете 0.
Других решений пока нет …