decbin

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

decbinПереводит число из десятичной системы счисления в двоичную

Описание

decbin(int $num): string

Функция возвращает строку, которая содержит двоичное представление аргумента num.

Список параметров

num

Десятичное значение для преобразования.

Диапазон входных данных для 32-битных машин
Положительное число num Отрицательное число num Возвращаемое значение
0   0
1   1
2   10
... и так далее ...
2 147 483 646   1111111111111111111111111111110
2 147 483 647 (наибольшее знаковое целое число)   1111111111111111111111111111111 (31 единица)
2147483648 -2147483648 10000000000000000000000000000000
... и так далее ...
4 294 967 294 -2 11111111111111111111111111111110
4 294 967 295 (наибольшее беззнаковое целое число) -1 11111111111111111111111111111111 (32 единицы)
Диапазон входных данных для 64-битных машин
Положительное число num Отрицательное число num Возвращаемое значение
0   0
1   1
2   10
... и так далее ...
9 223 372 036 854 775 806   111111111111111111111111111111111111111111111111111111111111110
9 223 372 036 854 775 807 (наибольшее знаковое целое число)   111111111111111111111111111111111111111111111111111111111111111 (63 единицы)
  -9 223 372 036 854 775 808 1000000000000000000000000000000000000000000000000000000000000000
... и так далее ...
  -2 1111111111111111111111111111111111111111111111111111111111111110
  -1 1111111111111111111111111111111111111111111111111111111111111111 (64 единицы)

Возвращаемые значения

Функция возвращает бинарное строковое представление числа num.

Примеры

Пример #1 Пример перевода значения из десятичной системы счисления в двоичную функцией decbin()

<?php

echo decbin(12) . "\n";
echo
decbin(26);

?>

Результат выполнения приведённого примера:

1100
11010

Смотрите также

  • bindec() - Преобразовывает двоичное число в десятичное
  • decoct() - Переводит число из десятичной системы счисления в восьмеричную
  • dechex() - Переводит число из десятичной системы счисления в шестнадцатеричную
  • base_convert() - Преобразовывает числа между произвольными системами счисления
  • printf() - Выводит отформатированную строку в двоичном представлении через форматы %b, %032b или %064b
  • sprintf() - Возвращает отформатированную строку в двоичном представлении через форматы %b, %032b или %064b

Добавить

Примечания пользователей 14 notes

up
29
MarcelG
10 years ago
To add leading zeros I prefer the following:
<?php
// Add leading zeros
$bin = sprintf( "%08d", decbin( 26 )); // "00011010"
?>
up
6
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";
?>
up
5
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 ));
?>
up
7
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

?>
up
6
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.
up
3
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
up
1
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;
}
up
1
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

?>
up
1
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;
}
up
-1
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.
up
-1
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
up
-1
ajl at gmx dot de
23 years ago
HERE you can convert 64bit instead of 32bit with the standard decbin
<?
function bigdecbin($dec,$doublewords=1) {
$erg = "";
do {
$rest = $dec%2147483648;
if ($rest<0) $rest+=2147483648;
$erg = str_pad(decbin($rest),31,"0",STR_PAD_LEFT).$erg;
$dec = ($dec-$rest)/2147483648;
} while (($dec>0)&&(!($dec<1)));

return str_pad($erg,$doublewords*31,"0",STR_PAD_LEFT);
}

echo "<pre>";
for ($i=1.5*2147483647.0-10;$i<1.5*2147483647.0+10;$i++) {
echo "DEC:".$i." BIN:".bigdecbin($i,2)."<br>";
}
echo "</pre>";
?>
up
-2
Anonymous
19 years ago
base_convert( base_convert('100001000100000000010001001000
0100100000001111111111111111111',2,10),10,2);

return
'1000010001000000000100010010000
100100000010000000000000000000'

this function doesn't work
up
-3
darkshad3 at yahoo dot com
17 years ago
<?php
Print bindecValues("1023");

function
bindecValues($decimal, $reverse=false, $inverse=false) {
/*
1. This function takes a decimal, converts it to binary and returns the
decimal values of each individual binary value (a 1) in the binary string.
You can use larger decimal values if you pass them to the function as a string!
2. The second optional parameter reverses the output.
3. The third optional parameter inverses the binary string, eg 101 becomes 010.
-- darkshad3 at yahoo dot com
*/

$bin = decbin($decimal);
if (
$inverse) {
$bin = str_replace("0", "x", $bin);
$bin = str_replace("1", "0", $bin);
$bin = str_replace("x", "1", $bin);
}
$total = strlen($bin);

$stock = array();

for (
$i = 0; $i < $total; $i++) {
if (
$bin{$i} != 0) {
$bin_2 = str_pad($bin{$i}, $total - $i, 0);
array_push($stock, bindec($bin_2));
}
}

$reverse ? rsort($stock):sort($stock);
return
implode(", ", $stock);
}
?>

The printed result is : 1, 2, 4, 8, 16, 32, 64, 128, 256, 512
To Top