2024 年 PHP 日本研討會

bindec

(PHP 4, PHP 5, PHP 7, PHP 8)

bindec二進位轉十進位

說明

bindec(字串 $binary_string): 整數|浮點數

傳回由 binary_string 參數表示的二進位數字的十進位等值。

bindec() 將二進位數字轉換為 int 或因大小因素需要時轉換為 float

bindec() 將所有 binary_string 值都解釋為無號整數。這是因為 bindec() 將最高有效位元視為另一個數量級,而不是符號位元。

參數

binary_string

要轉換的二進位字串。 binary_string 中的任何無效字元都會被靜默忽略。從 PHP 7.4.0 開始,提供任何無效字元已被棄用。

警告

參數必須是字串。使用其他資料類型將會產生非預期的結果。

傳回值

binary_string 的十進位值

更新日誌

版本 說明
7.4.0 傳遞無效字元現在會產生棄用通知。結果仍將如同無效字元不存在一樣計算。

範例

範例 #1 bindec() 範例

<?php
echo bindec('110011') . "\n";
echo
bindec('000110011') . "\n";

echo
bindec('111');
?>

上述範例將輸出

51
51
7

範例 #2 bindec() 將輸入解釋為無號整數

<?php
/*
* 這個範例的重點在於輸出結果
* 而非 PHP 程式碼本身。
*/

$magnitude_lower = pow(2, (PHP_INT_SIZE * 8) - 2);
p($magnitude_lower - 1);
p($magnitude_lower, '注意數值溢位了嗎?下次觀察看看...');

p(PHP_INT_MAX, 'PHP_INT_MAX');
p(~PHP_INT_MAX, '會被解讀為比 PHP_INT_MAX 大一');

if (
PHP_INT_SIZE == 4) {
$note = '會被解讀為最大的無號整數';
} else {
$note = '會被解讀為最大的無號整數
(18446744073709551615) 但會受到浮點數精度的影響'
;
}
p(-1, $note);


function
p($input, $note = '') {
echo
"輸入值: $input\n";

$format = '%0' . (PHP_INT_SIZE * 8) . 'b';
$bin = sprintf($format, $input);
echo
"二進位: $bin\n";

ini_set('precision', 20); // 為了在 64 位元機器上提高可讀性。
$dec = bindec($bin);
echo
'bindec(): ' . $dec . "\n";

if (
$note) {
echo
"備註: $note\n";
}

echo
"\n";
}
?>

上述範例在 32 位元機器上的輸出結果

input:        1073741823
binary:       00111111111111111111111111111111
bindec():     1073741823

input:        1073741824
binary:       01000000000000000000000000000000
bindec():     1073741824
NOTE:         See the rollover?  Watch it next time around...

input:        2147483647
binary:       01111111111111111111111111111111
bindec():     2147483647
NOTE:         PHP_INT_MAX

input:        -2147483648
binary:       10000000000000000000000000000000
bindec():     2147483648
NOTE:         interpreted to be one more than PHP_INT_MAX

input:        -1
binary:       11111111111111111111111111111111
bindec():     4294967295
NOTE:         interpreted to be the largest unsigned integer

上述範例在 64 位元機器上的輸出結果

input:        4611686018427387903
binary:       0011111111111111111111111111111111111111111111111111111111111111
bindec():     4611686018427387903

input:        4611686018427387904
binary:       0100000000000000000000000000000000000000000000000000000000000000
bindec():     4611686018427387904
NOTE:         See the rollover?  Watch it next time around...

input:        9223372036854775807
binary:       0111111111111111111111111111111111111111111111111111111111111111
bindec():     9223372036854775807
NOTE:         PHP_INT_MAX

input:        -9223372036854775808
binary:       1000000000000000000000000000000000000000000000000000000000000000
bindec():     9223372036854775808
NOTE:         interpreted to be one more than PHP_INT_MAX

input:        -1
binary:       1111111111111111111111111111111111111111111111111111111111111111
bindec():     18446744073709551616
NOTE:         interpreted to be the largest unsigned integer
              (18446744073709551615) but skewed by float precision

注意事項

注意事項:

此函式可以轉換過大而無法容納於平台 int 類型的數字,較大的值在此情況下會以 float 類型返回。

另請參閱

新增筆記

使用者貢獻的筆記 10 則筆記

info at rickdg dot nl
14 年前
兩個函式,使用二補數將 16 位元或 8 位元二進位轉換為整數。如果輸入超過最大位元數,則返回 false。透過更改十六進位值,可以輕鬆地將函式縮放到 x 位元。

<?php function _bin16dec($bin) {
// 使用二補數將 16 位元二進位數轉換為整數的函式
$num = bindec($bin);
if(
$num > 0xFFFF) { return false; }
if(
$num >= 0x8000) {
return -((
$num ^ 0xFFFF)+1);
} else {
return
$num;
}
}

function
_bin8dec($bin) {
// 使用二補數將 8 位元二進位數轉換為整數的函式
$num = bindec($bin);
if(
$num > 0xFF) { return false; }
if(
$num >= 0x80) {
return -((
$num ^ 0xFF)+1);
} else {
return
$num;
}
}
?>
martin at punix dot de
21 年前
## 使用「位移法」計算二進位 ##

<?php
函式 dec2bin($decimal_code){
for(
$half=($decimal_code);$half>=1;$half=(floor($half))/2){
if((
$half%2)!=0){
$y.=1;
}
else{
$y.=0;
}
}
$calculated_bin=strrev($y);
return
$calculated_bin;
}
?>

## 範例 ##

[二進位] 123 = [十進位] 1111011

例如:
123/2 = 61,5 => 1
61/2 = 30,5 => 1
30/2 = 15 => 0
15/2 = 7,5 => 1
7/2 = 3,5 => 1
3/2 = 1,5 => 1
1/2 = 0,5 => 1
(0/2 = 0 結束)
gwbdome at freenet dot de
20 年前
我認為我的方法比「位移方法」更好 ^^...
程式碼如下:

函式 convert2bin($string) {
$finished=0;
$base=1;
if(preg_match("/[^0-9]/", $string)) {
for($i=0; $string!=chr($i); $i++);
$dec_nr=$i;
}
else $dec_nr=$string;
while($dec_nr>$base) {
$base=$base*2;
if($base>$dec_nr) {
$base=$base/2;
break;
}
}
while(!$finished) {
if(($dec_nr-$base)>0) {
$dec_nr=$dec_nr-$base;
$bin_nr.=1;
$base=$base/2;
}
elseif(($dec_nr-$base)<0) {
$bin_nr.=0;
$base=$base/2;
}
elseif(($dec_nr-$base)==0) {
$bin_nr.=1;
$finished=1;
while($base>1) {
$bin_nr.=0;
$base=$base/2;
}
}
}
return $bin_nr;
}

=====================================================

如果你想把它轉換回來(從二進位到字串或整數),你可以使用這個函式

函式 reconvert($bin_nr) {
$base=1;
$dec_nr=0;
$bin_nr=explode(",", preg_replace("/(.*),/", "$1", str_replace("1", "1,", str_replace("0", "0,", $bin_nr))));
for($i=1; $i<count($bin_nr); $i++) $base=$base*2;
foreach($bin_nr as $key=>$bin_nr_bit) {
if($bin_nr_bit==1) {
$dec_nr+=$base;
$base=$base/2;
}
if($bin_nr_bit==0) $base=$base/2;
}
return(array("string"=>chr($dec_nr), "int"=>$dec_nr));
}
Nitrogen
15 年前
使用 BCMath 擴充套件進行二進位到十進位的轉換。

<?php

函式 BCBin2Dec($Input='') {
$Output='0';
if(
preg_match("/^[01]+$/",$Input)) {
for(
$i=0;$i<strlen($Input);$i++)
$Output=BCAdd(BCMul($Output,'2'),$Input{$i});
}
return(
$Output);
}

?>

這將使用 BCMath(任意精度計算)簡單地從二進位轉換為十進位。

另請參閱:我在 'decbin' 文件中的 'BCDec2Bin' 函式。
祝您使用愉快,
Nitrogen.
alan hogan dot com slash contact
17 年前
我寫的「smartbindec」函式可以將任何二進位字串(大小適中)轉換為十進位。如果最左邊的位元是 1,它會使用二補數,無論位元長度為何。如果您得到非預期的負數答案,請嘗試使用 sprintf("%032s", $yourBitString) 以零填補您的字串。

<?php
function twoscomp($bin) {
$out = "";
$mode = "init";
for(
$x = strlen($bin)-1; $x >= 0; $x--) {
if (
$mode != "init")
$out = ($bin[$x] == "0" ? "1" : "0").$out;
else {
if(
$bin[$x] == "1") {
$out = "1".$out;
$mode = "invert";
}
else
$out = "0".$out;
}
}
return
$out;
}
function
smartbindec($bin) {
if(
$bin[0] == 1)
return -
1 * bindec(twoscomp($bin));
else return (int)
bindec($bin);
}
?>
patrick dot boens at latosensu dot be
12 年前
將字串左移數個位元組
<?php
function STR_shl( $szStr,$nBits )
/*-----------------------------*/
{
if (
$nBits < 1 || $nBits > 7 ) /* 位元數不足 */
{
return (
$szStr ); /* 傳回原始字串 */
} /* if ( $nBits < 1 || $nBits > 7 ) */

if ( ( $iLength = strlen( $szStr ) ) <= 0 ) /* 字串為空 */
{
return (
$szStr ); /* 傳回原始字串 */
} /* if ( ( $iLength = strlen( $szStr ) ) <= 0 ) */

$szRetVal = ''; /* 建立空字串 */

$szBits = STR_Binary( $szStr ); /* 將 $szStr 轉換為二進位表示 */
$szLostBits = STR_Left( $szBits,$nBits ); /* 字串最左邊的 $nBits 個位元 */
$szShifted = substr( $szBits,$nBits ) . $szLostBits; /* 將 $szStr 左移 */

for ( $i = 0;$i < $iLength;$i++ ) /* 處理整個字串(每 8 個位元為一組) */
{
$szRetVal .= chr( bindec( substr( $szShifted,$i * 8,8 ) ) ); /* 將字元串接到結果字串 */
} /* for ( $i = 0;$i < $iLength;$i++ ) */

return ( $szRetVal ); /* 將結果傳回呼叫者 */
}
?>

將字串向右位移指定的位元組數
<?php

函數 STR_shr( $szStr,$nBits )
/*-----------------------------*/
{
如果 (
$nBits < 1 || $nBits > 7 ) /* 如果位數不足 */
{
返回 (
$szStr ); /* 返回原始字串 */
} /* if ( $nBits < 1 || $nBits > 7 ) */

如果 ( ( $iLength = strlen( $szStr ) ) <= 0 ) /* 如果字串為空 */
{
返回 (
$szStr ); /* 返回原始字串 */
} /* if ( ( $iLength = strlen( $szStr ) ) <= 0 ) */

$szRetVal = ''; /* 建立一個空字串 */

$szBits = STR_Binary( $szStr ); /* $szStr 的二進位表示 */
$szLostBits = STR_Right( $szBits,$nBits ); /* 字串最右邊的 $nBits 位元 */
$szShifted = $szLostBits . substr( $szBits,0,-$nBits ); /* $szStr 向右位移 */

對於 ( $i = 0;$i < $iLength;$i++ ) /* 處理整個字串(每 8 位元為一單位) */
{
$szRetVal .= chr( bindec( substr( $szShifted,$i * 8,8 ) ) ); /* 將 CHR 串接到結果字串 */
} /* for ( $i = 0;$i < $iLength;$i++ ) */

返回 ( $szRetVal ); /* 將結果返回給呼叫者 */
}
?>

前兩個函數所使用的其他函數
<?php
function STR_Binary( $szStr )
/*-------------------------*/
{
$szRetVal = ''; /* 預設回傳空字串 */

if ( ( $iLength = strlen( $szStr ) ) > 0 ) /* 如果字串不是空的 */
{
for (
$i = 0; $i < $iLength;$i++ ) /* 處理字串中的每個字元 */
{
$szRetVal .= sprintf( '%08b',ord( $szStr[$i] ) ); /* 將此字元轉換為二進位表示法 (8 位元) */
} /* for ( $i = 0; $i < $iLength;$i++ ) */
} /* if ( ( $iLength = strlen( $szStr ) ) > 0 ) */

return ( $szRetVal ); /* 將結果回傳給呼叫者 */
}

function
STR_Left( $szStr,$iCount = 1 )
/*----------------------------------*/
{
return
substr( $szStr,0,$iCount );
}
/* STR_Left() 函式結束 */

function STR_Right( $szString,$iCount )
/*----------------------------------*/
{
return
substr( $szString,0 + strlen( $szString ) - $iCount,$iCount );
}
?>
mashematician at gmail dot com
16 年前
一個二進位轉十進位的轉換函式,它利用 BC 函式庫的函式來回傳任意長度的十進位值。

輸入類型必須是字串才能正常運作。

<?php

function binary_to_decimal($a) {
$bin_array = str_split($a);

$y=sizeof($bin_array)-1;
for (
$x=0; $x<sizeof($bin_array)-1; $x++) {
if (
$bin_array[$x] == 1) {
$bin_array[$x] = bcpow(2, $y);
}
$y--;
}

for (
$z=0; $z<sizeof($bin_array); $z++) {
$result = bcadd($result, $bin_array[$z]);
}
echo
$result;
}

binary_to_decimal('11111');

?>
jpfstange at gmail dot com
8 年前
<?php

// 單精度浮點數 (binfloat)
// IEE754 標準
// https://zh.wikipedia.org/wiki/單精度浮點數格式

function binfloat(array $num) {

$sign = $num[0] ? 1 : -1; // 1 位元
$exponent = pow(2, bindec(implode('', array_slice($num, 1, 8))) - 127);
$fraction = array_slice($num, 9, count($num)); // 23 位元
$fracSum = 1;

for (
$i = 0; $i < 23; $i++) {

$fracSum += $fraction[$i] * pow(2, -1 - $i);

}

return
$fracSum * $exponent;

}

$num = isset($_GET['num']) ? $_GET['num'] : '00111110001000000000000000000000';

if (
strlen($num) < 32) {

echo
"無效的二進位數字 $num\n";
exit(
1);

}

$num = str_split($num);

echo
sprintf('數字:[%s]%s', implode('', $num), "\n");
echo
sprintf('結果:%s%s', binfloat($num), "\n");
flashpack at gmail dot com
16 年前
用於轉換分數
例如:1001.1101

<?php
函數 二進位轉十進位($binary){
$binary=trim($binary);
如果 (
strstr($binary,'.')){
$split=explode('.',$binary);
$integer=$split[0];
$fraction=$split[1];

$digits=str_split($fraction);
$num=sizeof($digits);
對於 (
$i=1; $i<=$num;$i++){
如果 (
$digits[$i-1]>1){
echo
'<script>alert("請只輸入二進位數字 {0,1}\n \n 例如: 11001 或 11001.011");history.go(-1)</script> ';
}
$exponent=pow(2,-$i);
$fraction_result+=$digits[$i-1]*$exponent;
}

}否則{
$integer=$binary;
}

$splits=str_split($integer);
$num=sizeof($splits)-1;
$i=$num;
foreach(
$splits 作為 $digits){
如果 (
$digits>1){
echo
'<script>alert("請只輸入二進位數字 {0,1}\n \n 例如: 11001 或 11001.011");history.go(-1)</script> ';
}
$exponent=pow(2,$i);
$integer_result+=$digits*$exponent;
$i--;
}
如果(
$fraction_result){
$result=$integer_result+$fraction_result;
}否則 {
$result=$integer_result;
}
返回
$result ;
}
?>
nodarinodo at mail dot ru
15 年前
<?php
// bindecfunc :)))) 我認為它也運作良好 :)
function bindecc($str)
{
$str = str_replace(" ", "", $str);
$strr = preg_match('/[^01]/', $str);
if(
$strr == 1) { return "<b> 錯誤!僅限 1 和 0;</b>"; }
$strsig = strlen($str);
$strr1 = strrev($str);
$strf = '';
for(
$i = $strsig; $i >= 0; $i--)
{
$strf += ($strr1[$i] * pow(2, $i));
#$strf += $str[$i];
}
return
$strf;
}
?>
To Top