2016-02-21 13 views
0

我一個Modbus響應是一個16位字節。每一位或幾位意味着特定的狀態。 (D15-14:輸入電壓狀態,D13:充電MOSFET短,依此類推)。PHP的檢查單位

我想一個簡單的方法來每次單個位與以前不同的打印字符串。

例如:如果數字「14」的轉變,打印「新伏狀態:正常」,如果在同一時間改變了D13太,打印「充電MOSFET短」。

我結束了一個不太優雅的解決方案:兩個值之間的異或,以便檢查哪個位有變化,然後通過XOR位進行for循環,而不是檢查索引時檢查索引位

,並比許多IF(如果$位是0比「的Mosfet是確定的」其他「MOSFET處於短」 ......有? 感謝名單

+0

你可以在Binay中打印你的數字到類似'$ one_char_per_bit = sprintf(「%016b」,$ Modbus_word)''的字符串中,然後以0或1的字符訪問每一位。 –

+0

[手冊中的位運算符](http://php.net/manual/en/language.operators.bitwise.php) – RiggsFolly

回答

0

爲RiggiFolly導演的快捷方式..你使用Binary運算符:

<?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"; 
     } 
    } 
?> 

Hope tha t幫助.. DNM