我正在做这些比较,看看哪些选项是启用的,但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对true
和false
的行为很奇怪。
尝试使用2 & 2 === 2
(===
而不是==
),看看是否效果更好。