PHP按位比较返回错误值

PHP按位比较返回错误值,php,bitwise-operators,Php,Bitwise Operators,我做这些比较是为了看看启用了哪些选项,但是PHP返回了错误的值。我正在检查用户启用了哪些银行 Próprio=1 Itaú=2 Bradesco=4 桑坦德=8 Caixa经济=16 汇丰银行=32 当我从MySQL加载数据时,我得到了16个,所以只有Caixa打开了,但是PHP说Próprio和HSBC it也打开了。我还做了其他测试,结果如下: 1&1=正确 1和2=假 1和4=假 1和8=假 1&16=正确 1&32=真 2&1=假 2&2=正确 2和4=假 2和8=假 2和16=假 2&

我做这些比较是为了看看启用了哪些选项,但是PHP返回了错误的值。我正在检查用户启用了哪些银行

Próprio=1
Itaú=2
Bradesco=4
桑坦德=8
Caixa经济=16
汇丰银行=32

当我从MySQL加载数据时,我得到了16个,所以只有Caixa打开了,但是PHP说Próprio和HSBC it也打开了。我还做了其他测试,结果如下:

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=真


提前感谢您的帮助。

PHP对
true
false
的行为异常


尝试使用
2&2===2
==
不是
==
),看看效果是否更好。

尝试将两个值都强制转换为
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()中的逐位比较规则/定义,必须/应该有其他结果

请记住,有一个问题。将按位运算放入括号中以获得所需结果:

(32 & 1)
由于您没有显示任何代码,我不能完全确定这是否是您的问题

编辑

As:按位运算符处理整数。为了安全起见,您可能希望首先将变量/值强制转换为整数:

( (int) 32 & (int) 1 )

这个例子是多余的,只是为了让大家看到我写的东西。

你一定是做错了什么:你在数据库中以什么格式保存数据?请告诉我们你正在使用的实际代码。无法复制:
var\u dump(1&32);int(0)
。你使用的确切密码是什么?它在哪里表现得很奇怪?每一个不同于零的数字都将是
true
0
将是
false
。对于位运算符,松散比较的行为与通常预期的完全相同:
if($bitmask&pow(2,$i)){echo“$i-th位集”}