當前位置: 首頁> 最新文章列表> 使用bindec() 處理正數與負數的區別

使用bindec() 處理正數與負數的區別

M66 2025-06-02

在PHP 中, bindec()函數用於將二進製字符串轉換為十進制數字。它的語法非常簡單:

 int bindec ( string $binary_string )

其中, $binary_string是一個只包含01的字符串,代表一個二進制數。


正數處理

當輸入的二進製字符串表示一個正數時, bindec()會直接將其轉換成對應的十進制數。例如:

 <?php
echo bindec("1010");  // 輸出 10
echo "\n";
echo bindec("1111");  // 輸出 15
?>

這裡的二進製字符串"1010""1111"分別轉換成了十進制的1015 。這是bindec()最常見的用法,結果完全符合預期。


負數處理

不同於有符號整數的表示方式, bindec()函數不會自動識別二進製字符串是否代表負數。它總是把輸入當成無符號的二進制數轉換為十進制。因此,如果直接傳入代表負數的補碼(二進制形式)字符串,結果會是一個很大的正整數。

舉個例子:

 <?php
echo bindec("11111111");  // 輸出 255,而不是 -1
echo "\n";
echo bindec("10000000");  // 輸出 128,而不是 -128
?>

這裡, "11111111"在8 位有符號整數中表示-1 ,但bindec()直接將它看成了無符號的255 。同理, "10000000"在8 位補碼中是-128 ,但函數返回的是128


如何正確處理負數?

如果你需要根據二進製字符串處理負數,必須自己實現對補碼的判斷和轉換。一個簡單的做法是:

  1. 判斷最高位(最高位為1 則視為負數)

  2. 若負數,則對其進行補碼轉換

示例代碼如下:

 <?php
function bindec_signed($bin) {
    $num = bindec($bin);
    $bits = strlen($bin);
    // 判斷最高位是否為1(負數標誌)
    if ($bin[0] === '1') {
        // 計算補碼的負數值
        $num -= (1 << $bits);
    }
    return $num;
}

// 測試
echo bindec_signed("11111111");  // 輸出 -1
echo "\n";
echo bindec_signed("10000000");  // 輸出 -128
echo "\n";
echo bindec_signed("01111111");  // 輸出 127
?>

這個函數利用了補碼的數學原理,對二進制數的最高位做了判斷,做出正確的正負轉換。


總結

  • bindec()函數默認把二進製字符串當成無符號數來處理,輸出的結果永遠是正整數或零。

  • 對於表示負數的二進制補碼, bindec()不能直接給出正確的負數值,需要自己額外處理。

  • 可以通過判斷最高位並結合補碼計算,實現對負數的正確轉換。