bindec

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

bindec二进制转十进制

描述

bindec(string $binary_string): int|float

返回由 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 notes

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
function 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
19 年前
我认为我的方法比 "移位方法" 更好 ^^...
以下是我的方法

function 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;
}

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

如果你想重新转换(从二进制转换为字符串或整数),可以使用这个函数

function 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

function 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(任意精度计算)简单地将 Base-2 转换为 Base-10。

另请参见:我在 "decbin" 文档中的 "BCDec2Bin" 函数。
享受,
Nitrogen。
alan hogan dot com slash contact
16 年前
我写的 "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 ) ) ); /* 将 CHR 连接到结果字符串 */
} /* for ( $i = 0;$i < $iLength;$i++ ) */

return ( $szRetVal ); /* 将结果返回给调用者 */
}
?>

将字符串右移指定字节数
<?php

函数 STR_shr( $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_Right( $szBits,$nBits ); /* 字符串最右边的 $nBits 位 */
$szShifted = $szLostBits . substr( $szBits,0,-$nBits ); /* $szStr 右移 */

for ( $i = 0;$i < $iLength;$i++ ) /* 处理整个字符串(每 8 位切片) */
{
$szRetVal .= chr( bindec( substr( $szShifted,$i * 8,8 ) ) ); /* 将 CHR 连接到结果字符串 */
} /* for ( $i = 0;$i < $iLength;$i++ ) */

return ( $szRetVal ); /* 返回结果给调用者 */
}
?>

前面两个函数使用的附加函数
<?php
函数 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 ); /* 返回结果给调用者 */
}

函数
STR_Left( $szStr,$iCount = 1 )
/*----------------------------------*/
{
return
substr( $szStr,0,$iCount );
}
/* 函数 strleft() 结束 */

函数 STR_Right( $szString,$iCount )
/*----------------------------------*/
{
return
substr( $szString,0 + strlen( $szString ) - $iCount,$iCount );
}
?>
mashematician at gmail dot com
16 年前
一个二进制到十进制转换函数,它利用 BC 库函数来返回任意长度的十进制值。

输入类型必须是字符串才能正常工作。

<?php

函数 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://en.wikipedia.org/wiki/Single-precision_floating-point_format

函数 binfloat(数组 $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('Num 是: [%s]%s',implode('',$num),"\n");
echo
sprintf('结果是: %s%s',binfloat($num),"\n");
flashpack at gmail dot com
15 年前
用于转换分数
例如:1001.1101

<?php
function BinaryToDecimal($binary){
$binary=trim($binary);
if (
strstr($binary,'.')){
$split=explode('.',$binary);
$integer=$split[0];
$fraction=$split[1];

$digits=str_split($fraction);
$num=sizeof($digits);
for (
$i=1; $i<=$num;$i++){
if (
$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;
}

}else{
$integer=$binary;
}

$splits=str_split($integer);
$num=sizeof($splits)-1;
$i=$num;
foreach(
$splits as $digits){
if (
$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--;
}
if(
$fraction_result){
$result=$integer_result+$fraction_result;
}else {
$result=$integer_result;
}
return
$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