我使用二进制代码来处理我在数据库中的覆盖,但是现在我需要查找规则是否匹配或者不匹配,我遵循规则。
当我使用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这样的二进制文件,有人能告诉我我在这里做了什么错误吗,我还是新来处理二进制代码作为规则的。
发布于 2015-04-08 21:23:00
你遇到了一个“有趣”的问题。这是decbin()返回一个字符串。
现在,如果按位和操作符的两个操作数都是字符串,则操作将使用字符串的ASCII值预先形成。
还引用了手册中的一段话,其中也说明了这一点:
如果和操作数都是字符串,那么操作将在组成字符串的字符的ASCII值
E 213上执行,其结果将是一个字符串。在所有其他情况下,,两个操作数将转换为整数,结果将是整数。
那么,这在你的具体例子中意味着什么呢?
让我们来看第二个if语句:
$overwirtes = 5;
decbin($overwirtes) & decbin(2)技术方面的评价如下:
0000 0101 (5)
0000 0010 (2)
---------- &
0000 0000 = 0 (FALSE)但是,由于两个操作数都是按位字符串,并接受这两个字符串的ASCII值,如下所示:
0011 0101 (53)
0011 0010 (50)
---------- &
0011 0000 = "48" (TRUE)这就是为什么代码中的所有条件都是TRUE的原因。
但现在如何解决这个问题呢?简单,只需将操作的1操作数更改为整数即可。因此,您可以从1、2、4、8中删除decbin()调用。
然后,您还可以在手册(上面的引号)中看到,当一个操作数不是一个字符串(这里是一个整数)时,两个操作数都被隐式转换为一个整数。你也会收到一个整数。
所以您的代码应该如下所示:
$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
}https://stackoverflow.com/questions/29525214
复制相似问题