单位的Php检查

单位的Php检查,php,bit-manipulation,Php,Bit Manipulation,我有一个16位字节的Modbus响应。每一位或几位表示一种特定的状态。(D15-14:输入电压状态,D13:充电mosfet短路,依此类推) 我想一个简单的方法来打印一个字符串,每次一个位是不同于以前 例如:如果数字“14”改变,则打印“新电压状态:正常”,如果同时也改变了D13,则打印“充电mosfet短路” 我最终得到了一个不完美的解决方案:两个值之间的xor用于检查哪个位发生了变化,然后通过xor位进行for循环,然后在位打开时检查位的索引和多个if(如果$bit为0,则表示“Mosfet

我有一个16位字节的Modbus响应。每一位或几位表示一种特定的状态。(D15-14:输入电压状态,D13:充电mosfet短路,依此类推)

我想一个简单的方法来打印一个字符串,每次一个位是不同于以前

例如:如果数字“14”改变,则打印“新电压状态:正常”,如果同时也改变了D13,则打印“充电mosfet短路”

我最终得到了一个不完美的解决方案:两个值之间的xor用于检查哪个位发生了变化,然后通过xor位进行for循环,然后在位打开时检查位的索引和多个if(如果$bit为0,则表示“Mosfet正常”,否则表示“Mosfet短”

有最快的方法吗?
Thanx

如RiggiFolly所述..使用二进制运算符:

<?php
    $value = 5;
    for($iShift = 0; $iShift < 8; $iShift++) {
        if($value & (1 << $iShift)) {
            echo "Bit " . ($iShift+1) . "  IS set\n";
        } else {
            echo "Bit " . ($iShift+1) . " NOT set\n";
        }
    }
?>

希望对你有帮助。。
DNM

您可以将二进制数字打印成一个字符串,类似于
$one\u char\u per\u bit=sprintf(“%016b”,$Modbus\u word)
,然后以0或1字符的形式访问每个位。