bindec

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

bindecConvierte de binario a decimal

Descripción

bindec(string $binary_string): int|float

Devuelve la conversión de un número binario representado por la cadena binary_string a decimal.

bindec() convierte un número binario en un entero, o, si es necesario por razones de tamaño, en un número decimal.

bindec() interpreta todos los valores binary_string como enteros no firmados. Esto se debe a que la función bindec() ve el primer bit como otro orden de magnitud en lugar de como el bit de signo.

Parámetros

binary_string

La cadena binaria a convertir. Cualquier carácter inválido en binary_string es ignorado silenciosamente. A partir de PHP 7.4.0, proporcionar caracteres inválidos está deprecado.

Advertencia

Este parámetro debe ser un string. El uso de otro tipo de datos produce resultados inesperados.

Valores devueltos

El valor decimal de binary_string

Historial de cambios

Versión Descripción
7.4.0 Proporcionar caracteres inválidos generará ahora una advertencia deprecada. El resultado se calculará siempre como si los caracteres inválidos no existieran.

Ejemplos

Ejemplo #1 Ejemplo con bindec()

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

echo
bindec('111');
?>

El ejemplo anterior mostrará :

51
51
7

Ejemplo #2 bindec() interpreta la entrada como un entero no firmado

<?php
/*
* Lo más importante en este ejemplo está en la salida
* más que en el código PHP en sí.
*/

$magnitude_lower = pow(2, (PHP_INT_SIZE * 8) - 2);
p($magnitude_lower - 1);
p($magnitude_lower, '¿Ha visto el cambio? Esté atento la próxima vez...');

p(PHP_INT_MAX, 'PHP_INT_MAX');
p(~PHP_INT_MAX, 'interpretado como superior a PHP_INT_MAX');

if (
PHP_INT_SIZE == 4) {
$note = 'interpretado como el mayor entero no firmado';
} else {
$note = 'interpretado como el mayor entero no firmado
(18446744073709551615) pero distorsionado por la precisión de los flotantes'
;
}
p(-1, $note);

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

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

ini_set('precision', 20); // Para mayor legibilidad en PC de 64 bits.
$dec = bindec($bin);
echo
'bindec() : ' . $dec . "\n";

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

echo
"\n";
}
?>

Resultado del ejemplo anterior en una máquina de 32 bits :

entrada :        1073741823
binario :       00111111111111111111111111111111
bindec() :     1073741823

entrada :        1073741824
binario :       01000000000000000000000000000000
bindec():     1073741824
Nota :         ¿Ha visto el cambio? Esté atento la próxima vez...

entrada :        2147483647
binario :       01111111111111111111111111111111
bindec():     2147483647
Nota :         PHP_INT_MAX

entrada :        -2147483648
binario :       10000000000000000000000000000000
bindec():     2147483648
Nota :         interpretado como superior a PHP_INT_MAX

entrada :        -1
binario :       11111111111111111111111111111111
bindec():     4294967295
Nota :         interpretado como el mayor entero no firmado

Resultado del ejemplo anterior en una máquina de 64 bits :

entrada :        4611686018427387903
binario :       0011111111111111111111111111111111111111111111111111111111111111
bindec() :     4611686018427387903

entrada :        4611686018427387904
binario :       0100000000000000000000000000000000000000000000000000000000000000
bindec() :     4611686018427387904
Nota :         ¿Ha visto el cambio? Esté atento la próxima vez...

entrada :        9223372036854775807
binario :       0111111111111111111111111111111111111111111111111111111111111111
bindec() :     9223372036854775807
Nota :         PHP_INT_MAX

entrada :        -9223372036854775808
binario :       1000000000000000000000000000000000000000000000000000000000000000
bindec() :     9223372036854775808
Nota :         interpretado como superior a PHP_INT_MAX

entrada :        -1
binario :       1111111111111111111111111111111111111111111111111111111111111111
bindec() :     18446744073709551616
Nota :         interpretado como el mayor entero no firmado
              (18446744073709551615) pero distorsionado por la precisión de los flotantes

Notas

Nota:

La función puede convertir números que son demasiado grandes para caber en un tipo entero, en cuyo caso estos valores se devuelven como número decimal.

Ver también

  • decbin() - Convierte de decimal a binario
  • octdec() - Conversión de octal a decimal
  • hexdec() - Convierte de hexadecimal a decimal
  • base_convert() - Convierte un número entre bases arbitrarias

add a note

User Contributed Notes 5 notes

up
7
info at rickdg dot nl
15 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
22 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
20 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
15 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
17 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);
}
?>
To Top