首页 > 解决方案 > php按位并返回错误结果

问题描述

当我使用以下变量时,我对两个变量的 AND 位运算有问题,返回正确的结果,“lock”= 1,open = 0

$ACRel = "00000000000000000000010000000000";

// $STS = "11000000011100000000";  //788224 locked
$STS = "‭11000000001100000000‬";  //787200 open

echo (is_numeric($STS)&is_numeric($ACRel));  // return 1 or 0 

我收到十进制的 $STS 变量,我使用 decbin() 函数进行转换:

$ACRel = "00000000000000000000010000000000";

//  $sts = decbin(788224);
$sts = decbin(787200); // return 11000000001100000000‬ 

echo (is_numeric($sts)&is_numeric($ACRel));

现在我总是返回 1,echo 中的 decbin 返回相同的值,但是当我使用 var_dump 时,我有:

$sts = "‭11000000001100000000‬";
/home/vagrant/code/project/pro/calc.php:8:string '‭11000000001100000000‬' (length=26)

$sts = decbin(788224);
/home/vagrant/code/project/pro/calc.php:12:string '11000000001100000000' (length=20)

为什么长度不同,字符串看起来一样?也许这就是答案?但我不知道为什么。

标签: phpbitwise-operatorsbitwise-and

解决方案


与您描述的问题相关,我在这里看到两个问题。

按位应用 AND

我看到的第一个问题是,对所描述的值变量应用按位与运算。

但这里的问题是,您在方法is_number的布尔输出上按位应用 AND。这意味着如果它们是正确的数字,您将始终得到 1。

这里的一个解决方案是,您应该在将字符串转换为 int: intval后应用。

非数值的 $STS 值

我在这里看到的第二个问题是在公开的第一个示例中,该变量的内容包含非数值

$STS = "‭11000000001100000000‬";  //787200 open

有一些字符是不可见的,但如果你用 ASCII 工具检查器检查,你可以看到它:看看这里这里并复制这个变量的值,你会看到它包含非数字:

11000000001100000000U+202C

因此,is_numeric方法返回 false,因为没有将此字符串识别为该非数字(不可见)值的数字。这就是为什么在第一个例子中你得到 0 的原因。


推荐阅读