在PHP 中, bindec()函數用於將二進製字符串轉換為十進制數字。它的語法非常簡單:
int bindec ( string $binary_string )
其中, $binary_string是一個只包含0和1的字符串,代表一個二進制數。
當輸入的二進製字符串表示一個正數時, bindec()會直接將其轉換成對應的十進制數。例如:
<?php
echo bindec("1010"); // 輸出 10
echo "\n";
echo bindec("1111"); // 輸出 15
?>
這裡的二進製字符串"1010"和"1111"分別轉換成了十進制的10和15 。這是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 則視為負數)
若負數,則對其進行補碼轉換
示例代碼如下:
<?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()不能直接給出正確的負數值,需要自己額外處理。
可以通過判斷最高位並結合補碼計算,實現對負數的正確轉換。