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');
?>
bindec
(PHP 4, PHP 5)
bindec — 2 進数 を 10 進数に変換する
説明
引数 binary_string により指定された 2 進数と等価な 10 進数を返します。
bindec() は、2 進数を integer に変換します。 サイズの問題により、必要に応じて float となることもあります。
パラメータ
- binary_string
-
変換したい 2 進数文字列。
返り値
binary_string を 10 進に変換した値を返します。
例
例1 bindec() の例
<?php
echo bindec('110011') . "\n";
echo bindec('000110011') . "\n";
echo bindec('111');
?>
上の例の出力は以下となります。
51 51 7
bindec
mashematician at gmail dot com
14-Mar-2008 01:57
14-Mar-2008 01:57
alan hogan dot com slash contact
09-Nov-2007 06:34
09-Nov-2007 06:34
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);
}
?>
26-Aug-2004 06:42
decbin('1001') is prefered as decbin(1001).
Because on larger bit string, it may cause problem :
decbin(100000000000000) return 3
else
decbin('100000000000000') return 16384
gwbdome at freenet dot de
20-Aug-2004 06:43
20-Aug-2004 06:43
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));
}
martin at punix dot de
30-May-2003 02:47
30-May-2003 02:47
## 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)
juancri at tagnet dot org
30-Oct-2002 09:16
30-Oct-2002 09:16
> The special reason 4 this is:
> (010) is an integer, left 0 is null, eg 010 = 10
> ('010') is a string, eg '010' = '010'
In binary, just like with decimals, the left 0's are nulls.
in Decimal: 010 = 10
in Binary: 010 = 10 too :o)
> echo decbin(bindec(010010010));
> returns 101000
010010010 is a octal number. It's eq. to 2101256 (decimal). decbin(bindec(010010010)) is 101000 because 010010010 = 2101256.
That's all =)
php at silisoftware dot com
01-Mar-2002 12:16
01-Mar-2002 12:16
For converting larger-than-31-bit numbers:
<?php
function Bin2Dec($binstring) {
for ($i=0;$i<strlen($binstring);$i++) {
$decvalue += ((int) substr($binstring, strlen($binstring) - $i - 1, 1)) * pow(2, $i);
}
return $decvalue;
}
?>
da_he4datthe-gurusdotde
17-Sep-2001 11:11
17-Sep-2001 11:11
[Editor's Note:
Numeric values starting with 0 are interpreted as octal (base eight) values. For example: 0101 is converts to 65
--zak@php.net]
i was quite confused while werking with those bindec()/decbin() functions..
while
echo decbin(bindec(1));
echo decbin(bindec(10));
echo decbin(bindec(101));
just worked like expected,
echo decbin(bindec(010));
returns just 0
and for any reason
echo decbin(bindec(010010010));
returns 101000
i dont think this is a bug (maybe theres some special reason 4 this?), but it took a certain time till i noticed that
echo decbin(bindec("010010010"));
works fine ...
hope this helps ne1.