我使用二进制代码来处理我的数据库中的覆盖,但现在我需要查找规则是否匹配或不匹配我有遵守规则。
当我使用php时,我尝试使用它像MySQL匹配:
$overwirtes = 5;
if ( decbin($overwirtes) & decbin(1) )
{
// unlock title
}
if ( decbin($overwirtes) & decbin(2) )
{
// unlock desc
}
if ( decbin($overwirtes) & decbin(4) )
{
// unlock price
}
if ( decbin($overwirtes) & decbin(8) )
{
// unlock stock
}
我期望它的标题和价格是解锁和desc和股票是锁定,但出了问题,PHP不会接受像MySQL这样的二进制文件,有人可以告诉我这里做错了什么,我还是新手二进制代码作为规则。
答案 0 :(得分:2)
你遇到了一个“有趣”的问题。这就是decbin()
返回一个字符串。
现在,如果bitwise AND运算符的两个操作数都是字符串,则操作将使用字符串的ASCII values执行。
该手册的引用也表明了这一点:
如果&,|的两个操作数和^运算符是字符串,然后操作将对构成字符串的字符的 ASCII值执行结果将是一个字符串。在所有其他情况中,两个操作数都将转换为整数,结果将为整数。
那么你的具体例子意味着什么?
让我们来看第二个if语句:
$overwirtes = 5;
decbin($overwirtes) & decbin(2)
技术性很好,应评估如下:
0000 0101 (5)
0000 0010 (2)
---------- &
0000 0000 = 0 (FALSE)
但是由于两个操作数都是字符串,因此按位AND取两个字符串的ASCII值,这就是:
0011 0101 (53)
0011 0010 (50)
---------- &
0011 0000 = "48" (TRUE)
这就是为什么代码中的所有条件都评估为TRUE。
decbin()
来电。
当1个操作数不是一个字符串(这里是一个整数),两个操作数都被隐式转换为整数时,你也可以在手册中看到(上面引用)。而且你还会收到一个整数。
所以你的代码应该是这样的:
$overwirtes = 5;
if ( decbin($overwirtes) & 1)
{
// unlock title
}
if ( decbin($overwirtes) & 2)
{
// unlock desc
}
if ( decbin($overwirtes) & 4)
{
// unlock price
}
if ( decbin($overwirtes) & 8)
{
// unlock stock
}