Побитовое сравнение 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 = истина

Заранее спасибо за любую помощь.

Author: Danniel Magno, 2011-05-04

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
 4
Author: Kaivosukeltaja, 2011-05-04 20:01:48

Как уже отмечали другие, то, что вы представляете в своем вопросе, трудно воспроизвести, и результаты должны быть подвергнуты сомнению, потому что в соответствии с правилами/определением побитового сравнения в PHP (Операторы побитового сравнения PHP ) должны быть/должны быть другие результаты.

Имейте в виду, что существует приоритет оператора . Заключите побитовую операцию в скобки, чтобы получить желаемый результат:

(32 & 1)

Поскольку вы не показали никакого кода, я не совсем уверен если это ваша проблема.

Редактировать

Как указал Кайвосукельтайя: Побитовый оператор работает с целыми числами. Возможно, вы захотите сначала привести свои переменные/значения к целым числам, чтобы быть в безопасности:

( (int) 32 & (int) 1 )

Этот пример приведен только для того, чтобы сделать видимым то, о чем я пишу.

 2
Author: hakre, 2017-05-23 12:14:13

PHP странно действует на то, что есть true и false.

Попробуйте использовать 2 & 2 === 2 (=== не ==) и посмотрите, работает ли это лучше.

 0
Author: Andrea, 2011-05-04 18:54:43