bindec

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

bindec — Wandelt von binĂ€r zu dezimal um

Beschreibung

function bindec(string $binary_string): int|float

Gibt die dezimale Entsprechung der in binĂ€rer Darstellung angegebenen Zeichenkette binary_string zurĂŒck.

bindec() wandelt eine binĂ€re Zahl in einen int oder, falls aus GrĂ¶ĂŸengrĂŒnden benötigt, in einen float um.

bindec() interpretiert alle binary_string-Werte als vorzeichenlose Ganzzahlen. Dies ist so, weil bindec() das höchstwertige Bit als weitere GrĂ¶ĂŸenordnung anstatt als Vorzeichenbit ansieht.

Parameter-Liste

binary_string

Die umzuwandelnde BinĂ€r-Zeichenkette. Jegliche ungĂŒltigen Zeichen in binary_string werden stillschweigend ignoriert. Von PHP 7.4.0 an ist die Übergabe jeglicher ungĂŒltiger Zeichen missbilligt.

Warnung

Der Parameter muss eine Zeichenkette sein. Andere Datentypen ergeben unerwartete Ergebnisse.

RĂŒckgabewerte

Der Dezimalwert von binary_string.

Changelog

Version Beschreibung
7.4.0 Die Übergabe ungĂŒltiger Zeichen löst nun einen Deprecation-Hinweis aus. Das Ergebnis wird weiterhin so berechnet, als wĂŒrden die ungĂŒltigen Zeichen nicht existieren.

Beispiele

Beispiel #1 bindec()-Beispiel

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

echo
bindec('111');
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

51
51
7

Beispiel #2 bindec() interpretiert die Eingabe als vorzeichenlose Ganzzahlen

<?php
/*
* Die Lektion dieses Beispiels liegt in der Ausgabe,
* und nicht im PHP-Code selbst.
*/

$magnitude_lower = pow(2, (PHP_INT_SIZE * 8) - 2);
p($magnitude_lower - 1);
p($magnitude_lower, 'Beachte den Überlauf, auch in den folgenden FĂ€llen!');

p(PHP_INT_MAX, 'PHP_INT_MAX');
p(~PHP_INT_MAX, 'interpretiert als eins mehr als PHP_INT_MAX');

if (
PHP_INT_SIZE == 4) {
$note = 'interpretiert als grĂ¶ĂŸte vorzeichenlose Ganzzahl';
} else {
$note = 'interpretiert als grĂ¶ĂŸte vorzeichenlose Ganzzahl (18446744073709551615),
aber ungenau aufgrund mangelnder Gleitkommagenauigkeit'
;
}
p(-1, $note);


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

$format = '%0' . (PHP_INT_SIZE * 8) . 'b';
$bin = sprintf($format, $input);
echo
"BinÀr: $bin\n";

ini_set('precision', 20); // zur Lesbarkeit auf 64bit-Systemen
$dec = bindec($bin);
echo
'bindec(): ' . $dec . "\n";

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

echo
"\n";
}
?>

Das oben gezeigte Beispiel erzeugt auf 32-Bit-Systemen folgende Ausgabe:

Eingabe:      1073741823
BinÀr:        00111111111111111111111111111111
bindec():     1073741823

Eingabe:      1073741824
BinÀr:        01000000000000000000000000000000
bindec():     1073741824
HINWEIS:      Beachte den Überlauf, auch in den folgenden FĂ€llen!

Eingabe:      2147483647
BinÀr:        01111111111111111111111111111111
bindec():     2147483647
HINWEIS:      PHP_INT_MAX

Eingabe:      -2147483648
BinÀr:        10000000000000000000000000000000
bindec():     2147483648
HINWEIS:      interpretiert als eins mehr als PHP_INT_MAX

Eingabe:      -1
BinÀr:        11111111111111111111111111111111
bindec():     4294967295
HINWEIS:      interpretiert als grĂ¶ĂŸte vorzeichenlose Ganzzahl

Das oben gezeigte Beispiel erzeugt auf 64-Bit-Systemen folgende Ausgabe:

Eingabe:      4611686018427387903
BinÀr:        0011111111111111111111111111111111111111111111111111111111111111
bindec():     4611686018427387903

Eingabe:      4611686018427387904
BinÀr:        0100000000000000000000000000000000000000000000000000000000000000
bindec():     4611686018427387904
HINWEIS:      Beachte den Überlauf, auch in den folgenden FĂ€llen!

Eingabe:      9223372036854775807
BinÀr:        0111111111111111111111111111111111111111111111111111111111111111
bindec():     9223372036854775807
HINWEIS:      PHP_INT_MAX

Eingabe:      -9223372036854775808
BinÀr:        1000000000000000000000000000000000000000000000000000000000000000
bindec():     9223372036854775808
HINWEIS:      interpretiert als eins mehr als PHP_INT_MAX

Eingabe:      -1
BinÀr:        1111111111111111111111111111111111111111111111111111111111111111
bindec():     18446744073709551616
HINWEIS:      interpretiert als grĂ¶ĂŸte vorzeichenlose Ganzzahl (18446744073709551615),
              aber ungenau aufgrund mangelnder Gleitkommagenauigkeit

Anmerkungen

Hinweis:

Die Funktion kann Zahlen umwandeln, die fĂŒr den Typ int der Plattform zu groß sind; grĂ¶ĂŸere Werte werden dann als float zurĂŒckgegeben.

Siehe auch

  • decbin() - Wandelt von dezimal zu binĂ€r um
  • octdec() - Wandelt von oktal zu dezimal um
  • hexdec() - Wandelt von hexadezimal zu dezimal um
  • base_convert() - Wandelt einen numerischen Wert zwischen verschiedenen Zahlensystemen um
add a note

User Contributed Notes 5 notes

up
7
info at rickdg dot nl ¶
16 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
3
martin at punix dot de ¶
23 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
3
gwbdome at freenet dot de ¶
21 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
2
Nitrogen ¶
16 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 ¶
18 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);
}
?>