Побитовое сравнение PHP, возвращающее неправильное значение - PullRequest
2 голосов
/ 04 мая 2011

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

Próprio = 1
Итау = 2
Bradesco = 4
Сантандер = 8
Caixa Econômica Federal = 16
HSBC = 32

Когда я загружаю данные из MySQL, я получаю 16, так что только Caixa включена, но PHP говорит, что Próprio и HSBC также включены.Я провел другие тесты и получил следующие результаты:

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

8 & 1 = false
8 & 2 = false
8 & 4 = false
8 & 8 =true
8 & 16 = false
8 & 32 = false

16 & 1 = true
16 & 2 = false
16 & 4 = false
16 & 8= false
16 & 16 = true
16 & 32 = true

32 & 1 = true
32 & 2 = true
32 & 4 = false
32 &8 = false
32 & 16 = true
32 & 32 = true

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

Ответы [ 3 ]

4 голосов
/ 04 мая 2011

Попробуйте привести оба значения к 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
2 голосов
/ 04 мая 2011

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

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

(32 & 1)

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

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

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

( (int) 32 & (int) 1 )

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

0 голосов
/ 04 мая 2011

PHP действует странно по отношению к true и false.

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

...