PHP位比较返回错误的值


PHP bitwise comparison returning wrong value

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

Próprio = 1
Itaú = 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

提前感谢您的帮助。

尝试在位运算符之前将两个值都转换为int。似乎"1" & "16" = 1,而"1" & "2" = 0

EDIT:这样做的原因是"如果左形参和右形参都是字符串,则按位运算符将对字符的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)

由于您没有显示任何代码,我不完全确定这是否是您的问题。

编辑

正如Kaivosukeltaja所指出的:位运算符适用于整数。为了安全起见,您可能需要先将变量/值强制转换为整数:

( (int) 32 & (int) 1 )

这个例子是多余的,只是为了让我写的东西清晰可见。

PHP对truefalse的行为很奇怪。

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