bindec

(PHP 4, PHP 5)

bindecConvertit de binaire en décimal

Description

number bindec ( string $binary_string )

Retourne la conversion d'un nombre binaire représenté par la chaîne binary_string en décimal.

bindec() convertie un nombre binaire en un entier, ou, si nécessaire (pour des raisons de taille), en nombre décimal.

bindec() interprète toutes les valeurs binary_string comme des valeurs non-signées entières. Ceci est dû au fait que la fonction bindec() voit le premier bit comme un autre ordre de grandeur plutôt que comme le bit de signe.

Liste de paramètres

binary_string

La chaîne binaire à convertir.

Avertissement

Ce paramètre doit être une chaîne de caractères. L'utilisation d'un autre type de données produit des résultats inattendus.

Valeurs de retour

La valeur décimale de binary_string

Exemples

Exemple #1 Exemple avec bindec()

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

echo 
bindec('111');
?>

L'exemple ci-dessus va afficher :

51
51
7

Exemple #2 bindec() interprète l'entrée comme un entier non-signé

<?php
/*
 * Le plus important dans cet exemple est dans la sortie
 * plutôt que dans le code PHP lui-même.
 */

$magnitude_lower pow(2, (PHP_INT_SIZE 8) - 2);
p($magnitude_lower 1);
p($magnitude_lower'Avez-vous vu le changement ? Soyez attentif la prochaine fois...');

p(PHP_INT_MAX'PHP_INT_MAX');
p(~PHP_INT_MAX'interprété comme étant supérieur à PHP_INT_MAX');

if (
PHP_INT_SIZE == 4) {
    
$note 'interprété comme étant le plus grand entier non-signé';
} else {
    
$note 'interprété comme étant le plus grand entier non-signé
              (18446744073709551615) mais faussé par la précision de la virgule flottante'
;
}
p(-1$note);


function 
p($input$note '') {
    echo 
"entrée :        $input\n";

    
$format '%0' . (PHP_INT_SIZE 8) . 'b';
    
$bin sprintf($format$input);
    echo 
"binaire :       $bin\n";

    
ini_set('precision'20);  // Pour plus de lisibilité sur les PC 64 bits.
    
$dec bindec($bin);
    echo 
'bindec() :     ' $dec "\n";

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

    echo 
"\n";
}
?>

Résultat de l'exemple ci-dessus sur une machine 32 bits :

entrée :        1073741823
binaire :       00111111111111111111111111111111
bindec() :     1073741823

entrée :        1073741824
binaire :       01000000000000000000000000000000
bindec():     1073741824
Note :         Avez-vous vu le changement ? Soyez attentif la prochaine fois...

entrée :        2147483647
binaire :       01111111111111111111111111111111
bindec():     2147483647
Note :         PHP_INT_MAX

entrée :        -2147483648
binaire :       10000000000000000000000000000000
bindec():     2147483648
Note :         interprété comme étant supérieur à PHP_INT_MAX

entrée :        -1
binaire :       11111111111111111111111111111111
bindec():     4294967295
Note :         interprété comme étant le plus grand entier non-signé

Résultat de l'exemple ci-dessus sur une machine 64 bits :

entrée :        4611686018427387903
binaire :       0011111111111111111111111111111111111111111111111111111111111111
bindec() :     4611686018427387903

entrée :        4611686018427387904
binaire :       0100000000000000000000000000000000000000000000000000000000000000
bindec() :     4611686018427387904
Note :         Avez-vous vu le changement ? Soyez attentif la prochaine fois...

entrée :        9223372036854775807
binaire :       0111111111111111111111111111111111111111111111111111111111111111
bindec() :     9223372036854775807
Note :         PHP_INT_MAX

entrée :        -9223372036854775808
binaire :       1000000000000000000000000000000000000000000000000000000000000000
bindec() :     9223372036854775808
Note :         interprété comme étant supérieur à PHP_INT_MAX

entrée :        -1
binaire :       1111111111111111111111111111111111111111111111111111111111111111
bindec() :     18446744073709551616
Note :         interprété comme étant le plus grand entier non-signé
              (18446744073709551615) mais faussé par la précision de la virgule flottante

Notes

Note:

La fonction peut convertir des nombres qui sont trop larges pour tenir dans un type entier ; dans ce cas, ces valeurs seront retournées sous la forme de nombres à virgule flottante.

Voir aussi

  • decbin() - Convertit de décimal en binaire
  • octdec() - Conversion d'octal en décimal
  • hexdec() - Convertit de hexadécimal en décimal
  • base_convert() - Convertit un nombre entre des bases arbitraires

add a note add a note

User Contributed Notes 9 notes

up
3
gwbdome at freenet dot de
10 years ago
i think a better method than the "shift-method" is my method ^^...
here it comes:

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

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

if you want to reconvert it (from binary to string or integer) you can use this function:

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));
}
up
3
martin at punix dot de
12 years ago
## calculate binary with "shift-method" ##

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

## example ##

[bin] 123 = [dec] 1111011

e.g.
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    finish)
up
2
info at rickdg dot nl
5 years ago
Two functions to convert 16bit or 8bit binary to integer using two's complement. If input exceeds maximum bits, false is returned. Function is easily scalable to x bits by changing the hexadecimals.

<?php function _bin16dec($bin) {
   
// Function to convert 16bit binary numbers to integers using two's complement
   
$num = bindec($bin);
    if(
$num > 0xFFFF) { return false; }
    if(
$num >= 0x8000) {
        return -((
$num ^ 0xFFFF)+1);
    } else {
        return
$num;
    }
}

function
_bin8dec($bin) {
   
// Function to convert 8bit binary numbers to integers using two's complement
   
$num = bindec($bin);
    if(
$num > 0xFF) { return false; }
    if(
$num >= 0x80) {
        return -((
$num ^ 0xFF)+1);
    } else {
        return
$num;
    }
}
?>
up
1
Nitrogen
6 years ago
Binary to Decimal conversion using the BCMath extension..

<?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);
}

?>

This will simply convert from Base-2 to Base-10 using BCMath (arbitrary precision calculation).

See also: my 'BCDec2Bin' function on the 'decbin' document.
Enjoy,
Nitrogen.
up
1
alan hogan dot com slash contact
7 years ago
The "smartbindec" function I wrote below will convert any binary string (of a reasonable size) to decimal.  It will use two's complement if the leftmost bit is 1, regardless of bit length.  If you are getting unexpected negative answers, try zero-padding your strings with 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);
}
?>
up
1
nodarinodo at mail dot ru
6 years ago
<?php   
// bindecfunc :)))) I think it works well too :)
function bindecc($str)
    {
       
$str = str_replace(" ", "", $str);
       
$strr = preg_match('/[^01]/', $str);
        if(
$strr == 1) { return "<b> Error ! only 1 and 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;
    }
?>
up
0
patrick dot boens at latosensu dot be
3 years ago
Left-shift a string by a number of bytes
<?php
function STR_shl( $szStr,$nBits )
/*-----------------------------*/
{
    if (
$nBits < 1 || $nBits > 7 )                                     /* If not adequate number of bits */
   
{
        return (
$szStr );                                              /* Return the original string */
   
}   /* if ( $nBits < 1 || $nBits > 7 ) */

   
if ( ( $iLength = strlen( $szStr ) ) <= 0 )                         /* If string empty */
   
{
        return (
$szStr );                                              /* Return the original string */
   
}   /* if ( ( $iLength = strlen( $szStr ) ) <= 0 ) */

   
$szRetVal   = '';                                                   /* Create an empty string */

   
$szBits     = STR_Binary( $szStr );                                 /* $szStr in bits */
   
$szLostBits = STR_Left( $szBits,$nBits );                           /* The $nBits leftmost bits of the string */
   
$szShifted  = substr( $szBits,$nBits ) . $szLostBits;               /* $szStr left shifted */

   
for ( $i = 0;$i < $iLength;$i++ )                                   /* Treat the entire string (per slice of 8 bits) */
   
{
       
$szRetVal .= chr( bindec( substr( $szShifted,$i * 8,8 ) ) );    /* Concatenate the CHR to the result string */
   
}   /* for ( $i = 0;$i < $iLength;$i++ ) */

   
return ( $szRetVal );                                               /* Return result to caller */
}
?>

Right-shift a string by a number of bytes
<?php

function STR_shr( $szStr,$nBits )
/*-----------------------------*/
{
    if (
$nBits < 1 || $nBits > 7 )                                     /* If not adequate number of bits */
   
{
        return (
$szStr );                                              /* Return the original string */
   
}   /* if ( $nBits < 1 || $nBits > 7 ) */

   
if ( ( $iLength = strlen( $szStr ) ) <= 0 )                         /* If string empty */
   
{
        return (
$szStr );                                              /* Return the original string */
   
}   /* if ( ( $iLength = strlen( $szStr ) ) <= 0 ) */

   
$szRetVal   = '';                                                   /* Create an empty string */

   
$szBits     = STR_Binary( $szStr );                                 /* $szStr in bits */
   
$szLostBits = STR_Right( $szBits,$nBits );                          /* The $nBits rightmost bits of the string */
   
$szShifted  = $szLostBits . substr( $szBits,0,-$nBits );            /* $szStr right shifted */

   
for ( $i = 0;$i < $iLength;$i++ )                                   /* Treat the entire string (per slice of 8 bits) */
   
{
       
$szRetVal .= chr( bindec( substr( $szShifted,$i * 8,8 ) ) );    /* Concatenate the CHR to the result string */
   
}   /* for ( $i = 0;$i < $iLength;$i++ ) */

   
return ( $szRetVal );                                               /* Return result to caller */
}
?>

Additional functions used by the two preceding:
<?php
function STR_Binary( $szStr )
/*-------------------------*/
{
   
$szRetVal = '';                                                     /* Ready to return an empty string */

   
if ( ( $iLength = strlen( $szStr ) ) > 0 )                          /* If string NOT empty */
   
{
        for (
$i = 0; $i < $iLength;$i++ )                              /* Treat each character of the string */
       
{
           
$szRetVal .= sprintf( '%08b',ord( $szStr[$i] ) );           /* Turn this char to a binary representation (8 bits) */
       
}   /* for ( $i = 0; $i < $iLength;$i++ ) */
   
}   /* if ( ( $iLength = strlen( $szStr ) ) > 0 ) */

   
return ( $szRetVal );                                               /* Return result to caller */
}

function
STR_Left( $szStr,$iCount = 1 )
/*----------------------------------*/
{
    return
substr( $szStr,0,$iCount );
}  
/* End of function strleft() */

function STR_Right( $szString,$iCount )
/*----------------------------------*/
{
    return
substr( $szString,0 + strlen( $szString ) - $iCount,$iCount );
}
?>
up
0
mashematician at gmail dot com
7 years ago
A binary to decimal conversion function that takes advantage of the BC library functions to return decimal values of arbitrary length.

Input type must be a string in order to work properly.

<?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');

?>
up
-1
flashpack at gmail dot com
6 years ago
for converting fractions :
eg : 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("Enter Binary Digits Only {0,1}\n \n eg: 11001 or 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("Enter Binary Digits Only {0,1}\n \n eg: 11001 or 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 ;
}
?>
To Top