PHPKonf: Istanbul PHP Conference 2017

# bindec

(PHP 4, PHP 5)

bindecDa binario a decimale

### Descrizione

int bindec ( string \$stringa_binaria )

Restituisce il decimale equivalente al numero binario rappresentato dall'argomento stringa_binaria.

bindec() converte un binario in integer. Il più grande numero che può essere convertito è 31 volte la cifra 1 oppure 2147483647 espresso in formato decimale.

Example #1 Esempio di bindec()

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

echo
bindec('111');
?>

L'esempio precedente visualizzerà:

51
51
7

Vedere anche decbin(), octdec(), hexdec() e base_convert().

### User Contributed Notes 10 notes

martin at punix dot de
13 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)
gwbdome at freenet dot de
12 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));
}
info at rickdg dot nl
6 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;
}
}
?>
jpfstange at gmail dot com
1 year ago
<?php

//binfloat (For single precision floating point numbers)
//IEE754
//https://en.wikipedia.org/wiki/Single-precision_floating-point_format

function binfloat(Array \$num){

\$sign           =       \$num[0] ? 1 : -1;                       //1 bit

\$exponent       =       pow(2,bindec(implode('',array_slice(\$num,1,8)))-127);

\$fraction       =       array_slice(\$num,9,count(\$num));        //23 bits

\$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
"Invalid binary number \$num\n";
exit(
1);

}

\$num    =       str_split(\$num);

echo
sprintf('Num is: [%s]%s',implode('',\$num),"\n");
echo
sprintf('Result is: %s%s',binfloat(\$num),"\n");
patrick dot boens at latosensu dot be
4 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 );
}
?>
Nitrogen
7 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++)

}
return(
\$Output);
}

?>

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

Enjoy,
Nitrogen.
nodarinodo at mail dot ru
8 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;
}
?>
mashematician at gmail dot com
8 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++) {

}
echo
\$result;
}

binary_to_decimal('11111');

?>
alan hogan dot com slash contact
9 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);
}
?>
-1
flashpack at gmail dot com
8 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 ;
}
?>