PHP Conference Japan 2024

bindec

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

bindec二进制转换为十进制

描述

bindec(字符串 $binary_string): 整数|浮点数

返回由 binary_string 参数表示的二进制数的十进制等价物。

bindec() 将二进制数转换为 整数,或者如果由于大小原因需要,则转换为 浮点数

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

注释

注意:

该函数可以转换超出平台 整数 类型范围的数字,在这种情况下,较大的值将作为 浮点数 返回。

参见

添加注释

用户贡献的注释 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;
}
}
?>
[email protected]
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 结束)
[email protected]
20年前
我认为我的方法比“移位法”更好^^...
如下所示

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(任意精度计算)将二进制转换为十进制。

另请参阅:“decbin”文档中的我的“BCDec2Bin”函数。
享受,
Nitrogen。
alan.hogan.com/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);
}
?>
[email protected]
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

function 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
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 );
}
/* strleft() 函数结束 */

function STR_Right( $szString,$iCount )
/*----------------------------------*/
{
return
substr( $szString,0 + strlen( $szString ) - $iCount,$iCount );
}
?>
[email protected]
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');

?>
[email protected]
8年前
<?php

//binfloat (用于单精度浮点数)
//IEE754
//https://en.wikipedia.org/wiki/Single-precision_floating-point_format

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