Побитовое сравнение PHP, возвращающее неверное значение
Я провожу эти сравнения, чтобы увидеть, какие параметры включены, но PHP возвращает неправильные значения. Я точно проверяю, какие банки были включены пользователем.
Próprio= 1
Итау= 2
Брадеско = 4
Сантандер = 8
Caixa Экономика Федеральная = 16
HSBC = 32
Когда я загружаю данные из MySQL, я получаю 16, поэтому включена только Caixa, но PHP говорит, что Próprio и HSBC тоже включены. Я провел другие тесты и получил следующее результаты:
1 & 1 = истина
1 и 2 = ложь
1 и 4 = ложь
1 и 8 = ложь
1 и 16 = истина
1 и 32 = истина
2 & 1 = ложь
2 & 2 = истина
2 и 4 = ложь
2 и 8 = ложь
2 и 16 = ложь
2 и 32 = истина
4 & 1 = ложь
4 & 2 = ложь
4 & 4 = истина
4 и 8 = ложь
4 и 16 = ложь
4 и 32 = ложь
8 & 1 = ложь
8 & 2 = ложь
8 и 4 = ложь
8 & 8 = истина
8 и 16 = ложь
8 и 32 = ложь
16 & 1 = истина
16 & 2 = ложь
16 & 4 = ложь
16 и 8 = ложь
16 и 16 = истина
16 и 32 = истина
32 &1 = истина
32 & 2 = истина
32 & 4 = ложь
32 и 8 = ложь
32 и 16 = истина
32 и 32 = истина
Заранее спасибо за любую помощь.
3 answers
Попробуйте привести оба значения к int
перед побитовым оператором. Кажется, что "1" & "16" = 1
в то время как "1" & "2" = 0
.
РЕДАКТИРОВАТЬ: Причина этого заключается в том, что "Если и левый, и правый параметры являются строками, побитовый оператор будет работать со значениями ASCII символов", как описано в руководстве .
РЕДАКТИРОВАТЬ 2: Быстрый тест, выполняющий побитовые операции со значениями, приведенными к строкам, похоже, дает результаты, соответствующие вашим:
"1" & "1" == true
"1" & "2" == false
"1" & "4" == false
"1" & "8" == false
"1" & "16" == true
"1" & "32" == true
"2" & "1" == false
"2" & "2" == true
"2" & "4" == false
"2" & "8" == false
"2" & "16" == false
"2" & "32" == true
"4" & "1" == false
"4" & "2" == false
"4" & "4" == true
"4" & "8" == false
"4" & "16" == false
"4" & "32" == false
Как уже отмечали другие, то, что вы представляете в своем вопросе, трудно воспроизвести, и результаты должны быть подвергнуты сомнению, потому что в соответствии с правилами/определением побитового сравнения в PHP (Операторы побитового сравнения PHP ) должны быть/должны быть другие результаты.
Имейте в виду, что существует приоритет оператора . Заключите побитовую операцию в скобки, чтобы получить желаемый результат:
(32 & 1)
Поскольку вы не показали никакого кода, я не совсем уверен если это ваша проблема.
Редактировать
Как указал Кайвосукельтайя: Побитовый оператор работает с целыми числами. Возможно, вы захотите сначала привести свои переменные/значения к целым числам, чтобы быть в безопасности:
( (int) 32 & (int) 1 )
Этот пример приведен только для того, чтобы сделать видимым то, о чем я пишу.
PHP странно действует на то, что есть true
и false
.
Попробуйте использовать 2 & 2 === 2
(===
не ==
) и посмотрите, работает ли это лучше.