decbin
(PHP 4, PHP 5, PHP 7, PHP 8)
decbin — 10 進数を 2 進数に変換する
パラメータ
num
-
変換したい 10 進数値。
32 ビットマシンでの入力の範囲 正の num
負の num
戻り値 0 0 1 1 2 10 ... normal progression ... 2147483646 1111111111111111111111111111110 2147483647 (符号付き integer の最大値) 1111111111111111111111111111111 (1 が 31 個) 2147483648 -2147483648 10000000000000000000000000000000 ... normal progression ... 4294967294 -2 11111111111111111111111111111110 4294967295 (符号なし integer の最大値) -1 11111111111111111111111111111111 (1 が 32 個) 64 ビットマシンでの入力の範囲 正の num
負の num
戻り値 0 0 1 1 2 10 ... normal progression ... 9223372036854775806 111111111111111111111111111111111111111111111111111111111111110 9223372036854775807 (符号付き integer の最大値) 111111111111111111111111111111111111111111111111111111111111111 (1 が 63 個) -9223372036854775808 1000000000000000000000000000000000000000000000000000000000000000 ... normal progression ... -2 1111111111111111111111111111111111111111111111111111111111111110 -1 1111111111111111111111111111111111111111111111111111111111111111 (1 が 64 個)
戻り値
num
を 2 進文字列で表した値を返します。
例
例1 decbin() の例
<?php
echo decbin(12) . "\n";
echo decbin(26);
?>
上の例の出力は以下となります。
1100 11010
+add a note
User Contributed Notes 14 notes
MarcelG ¶
10 years ago
To add leading zeros I prefer the following:
<?php
// Add leading zeros
$bin = sprintf( "%08d", decbin( 26 )); // "00011010"
?>
rambabusaravanan at gmail dot com ¶
7 years ago
Print as binary format with leading zeros into a variable in one simple statement.
<?php
$binary = sprintf('%08b', $decimal); // $decimal = 5;
echo $binary; // $binary = "00000101";
?>
coverup ¶
7 years ago
Regarding trailing zeros, after test all the option mention here by others, i have performed my own tests regarding efficiency, here are the results:
<?php
$decimal = 9;
$time_start = microtime(true);
for ($i=0;$i<1000;$i++){
$bin = printf('%08b', $decimal);
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "<hr>Duracion $time segundos<br>\n";
echo $bin . '<br>';
$time_start = microtime(true);
for ($i=0;$i<1000;$i++){
$bin = sprintf( "%08d", decbin( $decimal ));
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "<hr>Duracion $time segundos<br>\n";
echo $bin . '<br>';
$time_start = microtime(true);
for ($i=0;$i<1000;$i++){
$bin = decbin($decimal);
$bin = substr("00000000",0,8 - strlen($bin)) . $bin;
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "<hr>Duracion $time segundos<br>\n";
echo $bin . '<br>';
?>
results
0000100100001001000010010000100.... (output is echoed 1000 times)
Duracion 0.0134768486023 segundos
8
Duracion 0.00054407119751 segundos
00001001
Duracion 0.000833988189697 segundos
00001001
Thus the winner is
<?php
$bin = sprintf( "%08d", decbin( $decimal ));
?>
Xavier Daull ¶
18 years ago
A fast function to convert a binary string to a bit sequence
<?php
function BinString2BitSequence($mystring) {
$mybitseq = "";
$end = strlen($mystring);
for($i = 0 ; $i < $end; $i++){
$mybyte = decbin(ord($mystring[$i])); // convert char to bit string
$mybitseq .= substr("00000000",0,8 - strlen($mybyte)) . $mybyte; // 8 bit packed
}
return $mybitseq;
}
echo BinString2BitSequence("ABCDEF"); // OUTPUT=010000010100001001000011010001000100010101000110
?>
Anonymous ¶
18 years ago
Just an example:
If you convert 26 to bin you'll get 11010, which is 5 chars long. If you need the full 8-bit value use this:
$bin = decbin(26);
$bin = substr("00000000",0,8 - strlen($bin)) . $bin;
This will convert 11010 to 00011010.
noname at example dot com ¶
9 years ago
If you want leading zeros use php built-in features instead of custom functions
<?php
printf('%08b', $decimal);
?>
>> printf('%08b', E_NOTICE)
>> 00001000
dj.luiting(.a.t.)gmail.com ¶
10 years ago
hi folks, i struggled for a day to get a big decimal number converted into binary, on the windows platform.
finally with bcmath functions this is what worked for me.
function bc_convert2bin($string) {
//got it to work with bcmath functions, works for 64 bit on 32 bit windows machine
$finished=0;
$base=2;
$bin_nr='';
if(preg_match("/[^0-9]/", $string)) {
for($i=0; $string!=chr($i); $i++) {
$dec_nr=$i;
}
} else {
$dec_nr=$string;
}
//while( $dec_nr>$base ) {
while( bccomp($dec_nr,$base) == 1 ) {
//$base=$base*2;
$base=bcmul($base,'2');
//if($base>$dec_nr) {
if( bccomp($base,$dec_nr) == 1 ) {
//$base=$base/2;
$base=bcdiv($base,'2');
break;
}
}
while(!$finished) {
//if(($dec_nr-$base)>0) {
if( bccomp( bcsub($dec_nr,$base) , 0) == 1 ) {
//$dec_nr=$dec_nr-$base;
$dec_nr=bcsub($dec_nr,$base);
$bin_nr.=1;
//$base=$base/2;
$base=bcdiv($base,'2');
//} elseif(($dec_nr-$base)<0) {
} elseif( bccomp( bcsub($dec_nr,$base) , 0) == -1 ) {
$bin_nr.=0;
//$base=$base/2;
$base=bcdiv($base,'2');
//} elseif(($dec_nr-$base)==0) {
} elseif( bccomp( bcsub($dec_nr,$base) , 0) == 0 ) {
$bin_nr.=1;
$finished=1;
//while($base>1) {
while( bccomp($base,1) == 1 ) {
$bin_nr.=0;
//$base=$base/2;
$base=bcdiv($base,'2');
}
}
}
return $bin_nr;
}
malcolm.murphy ¶
7 years ago
The GNU MP library (http://php.net/manual/en/book.gmp.php) provides methods to efficiently convert binary strings of any length to their binary representation (i.e., a `decbin` equivalent for strings).
<?php
$str = random_bytes(1024); // binary string example
$result = gmp_strval(gmp_import($str), 2); // see manual for options such as endianness
$zeroPadded = sprintf('%0' . (strlen($str) * 8) . 's', $result); // zero-pad if needed, e.g. with str_pad, or sprintf as shown here
$strAgain = gmp_export(gmp_init($result, 2)); // reverse operation similar to bindec
?>
php at silisoftware dot com ¶
22 years ago
Another larger-than-31-bit function.
Works for very large numbers, but at the expense of perfect bit-precision as the size increases (I noticed rounding errors past 16 or so decimal places) so use with caution, and only when decbin() won't cut it.
function Dec2Bin($number) {
while ($number >= 256) {
$bytes[] = (($number / 256) - (floor($number / 256))) * 256;
$number = floor($number / 256);
}
$bytes[] = $number;
for ($i=0;$i<count($bytes);$i++) {
$binstring = (($i == count($bytes) - 1) ? decbin($bytes[$i]) : str_pad(decbin($bytes[$i]), 8, "0", STR_PAD_LEFT)).$binstring;
}
return $binstring;
}
Nitrogen ¶
15 years ago
Decimal to Binary conversion using the BCMath extension.
<?php
function BCDec2Bin($Input='') {
$Output='';
if(preg_match("/^\d+$/",$Input)) {
while($Input!='0') {
$Output.=chr(48+($Input{strlen($Input)-1}%2));
$Input=BCDiv($Input,'2');
}
$Output=strrev($Output);
}
return(($Output!='')?$Output:'0');
}
?>
This will simply convert from Base-10 to Base-2 using BCMath (arbitrary precision calculation).
See also: my 'BCBin2Dec' function on the 'bindec' document.
Enjoy,
Nitrogen.
mcampa at gmail dot com ¶
11 years ago
A little useful little function that returns a binary string with leading 0s:
function d2b($n) {
return str_pad(decbin($n), 16, "0", STR_PAD_LEFT);
}
// example:
echo d2b(E_ALL);
echo d2b(E_ALL | E_STRICT);
echo d2b(0xAA55);
echo d2b(5);
Output:
0111011111111111
0111111111111111
1010101001010101
0000000000000101