我正在进行这些比较以查看启用了哪些选项,但PHP返回了错误的值。我正在检查用户启用了哪些银行。
Próprio= 1
Itaú= 2
Bradesco = 4
桑坦德= 8
CaixaEconômicaFederal= 16
汇丰银行= 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 =真
提前感谢您的帮助。
答案 0 :(得分:4)
尝试在按位运算符之前将两个值都转换为int
。似乎"1" & "16" = 1
而"1" & "2" = 0
。
编辑:原因是“如果左侧和右侧参数都是字符串,则按位运算符将对字符的ASCII值进行操作”,如{ {3}}。
编辑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
答案 1 :(得分:2)
正如其他人已经评论过的那样,你在问题中提出的内容难以复制,结果会受到质疑,因为遵循PHP(PHP bitwise comparison operators)中按位比较的规则/定义,必须/应该是其他的结果
请注意,有一个operator precedence。将按位运算放入括号中以获得所需结果:
(32 & 1)
由于您没有显示任何代码,我不能完全确定这是否是您的问题。
修改强>
As Kaivosukeltaja pointed out:按位运算符处理整数。您可能希望首先将变量/值转换为整数以保证安全:
( (int) 32 & (int) 1 )
这个例子只是为了让我能够看到我正在写的东西。
答案 2 :(得分:0)
PHP对true
和false
的内容采取了奇怪的行为。
尝试使用2 & 2 === 2
(===
而不是==
),看看是否效果更好。