2024 年 PHP 开发者大会日本站

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
… 正常进度 …
2147483646   1111111111111111111111111111110
2147483647(最大有符号整数)   1111111111111111111111111111111(31 个 1)
2147483648 -2147483648 10000000000000000000000000000000
… 正常进度 …
4294967294 -2 11111111111111111111111111111110
4294967295(最大无符号整数) -1 11111111111111111111111111111111(32 个 1)
64 位机器上的输入范围
正数 num 负数 num 返回值
0   0
1   1
2   10
… 正常进度 …
9223372036854775806   111111111111111111111111111111111111111111111111111111111111110
9223372036854775807(最大有符号整数)   111111111111111111111111111111111111111111111111111111111111111(63 个 1)
  -9223372036854775808 1000000000000000000000000000000000000000000000000000000000000000
… 正常进度 …
  -2 1111111111111111111111111111111111111111111111111111111111111110
  -1 1111111111111111111111111111111111111111111111111111111111111111(64 个 1)

返回值

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 条注释

MarcelG
10 年前
为了添加前导零,我更喜欢以下方法
<?php
// 添加前导零
$bin = sprintf( "%08d", decbin( 26 )); // "00011010"
?>
rambabusaravanan at gmail dot com
7 年前
将带有前导零的二进制格式打印到一个变量中,只需一条简单的语句。

<?php
$binary
= sprintf('%08b', $decimal); // $decimal = 5;
echo $binary; // $binary = "00000101";
?>
coverup
7 年前
关于尾随零,在测试了其他人在此处提到的所有选项后,我已经进行了自己的效率测试,以下是结果

<?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>';

?>

结果

0000100100001001000010010000100....(输出被回显 1000 次)
Duracion 0.0134768486023 秒
8
Duracion 0.00054407119751 秒
00001001
Duracion 0.000833988189697 秒
00001001

因此,获胜者是
<?php
$bin
= sprintf( "%08d", decbin( $decimal ));
?>
Xavier Daull
18 年前
一个快速函数,用于将二进制字符串转换为位序列

<?php

function BinString2BitSequence($mystring) {
$mybitseq = "";
$end = strlen($mystring);
for(
$i = 0 ; $i < $end; $i++){
$mybyte = decbin(ord($mystring[$i])); // 将字符转换为比特串
$mybitseq .= substr("00000000",0,8 - strlen($mybyte)) . $mybyte; // 8位打包
}
return
$mybitseq;
}

echo
BinString2BitSequence("ABCDEF"); // 输出=010000010100001001000011010001000100010101000110

?>
匿名用户
18 年前
只是一个例子
如果你将26转换为二进制,你会得到11010,这是5个字符长。如果你需要完整的8位值,请使用这个

$bin = decbin(26);
$bin = substr("00000000",0,8 - strlen($bin)) . $bin;

这会将11010转换为00011010。
noname at example dot com
9年前
如果你想要前导零,请使用PHP内置功能而不是自定义函数

<?php
printf
('%08b', $decimal);
?>

>> printf('%08b', E_NOTICE)
>> 00001000
dj.luiting(.a.t.)gmail.com
10 年前
大家好,我在Windows平台上花了整整一天的时间才将一个很大的十进制数转换为二进制。
最后,使用bcmath函数,这个方法对我有用。

function bc_convert2bin($string) {

//使用bcmath函数使其工作,在32位Windows机器上适用于64位
$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 年前
GNU MP 库 (https://php.net/manual/en/book.gmp.php) 提供了有效地将任意长度的二进制字符串转换为其二进制表示的方法(即,`decbin` 的字符串等效项)。

<?php

$str
= random_bytes(1024); // 二进制字符串示例

$result = gmp_strval(gmp_import($str), 2); // 查看手册以了解选项,例如字节序

$zeroPadded = sprintf('%0' . (strlen($str) * 8) . 's', $result); // 如果需要,进行零填充,例如使用 str_pad 或此处所示的 sprintf

$strAgain = gmp_export(gmp_init($result, 2)); // 与 bindec 类似的反向操作

?>
php at silisoftware dot com
22年前
另一个大于31位的函数。
适用于非常大的数字,但以牺牲完美的位精度为代价(我注意到超过16位小数点后的舍入误差),因此请谨慎使用,只有在decbin()不起作用时才使用。

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年前
使用BCMath扩展进行十进制到二进制的转换。

<?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');
}

?>

这将简单地使用BCMath(任意精度计算)从Base-10转换为Base-2。

另见:我在“bindec”文档上的“BCBin2Dec”函数。
享受,
Nitrogen。
mcampa at gmail dot com
11年前
一个非常有用的函数,它返回一个带有前导0的二进制字符串

function d2b($n) {
return str_pad(decbin($n), 16, "0", STR_PAD_LEFT);
}

// 例子
echo d2b(E_ALL);
echo d2b(E_ALL | E_STRICT);
echo d2b(0xAA55);
echo d2b(5);

输出
0111011111111111
0111111111111111
1010101001010101
0000000000000101
ajl at gmx dot de
23年前
在这里,你可以使用标准decbin转换64位而不是32位
<?
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>";
?>
匿名用户
19年前
base_convert( base_convert('100001000100000000010001001000
0100100000001111111111111111111',2,10),10,2);

返回
'1000010001000000000100010010000
100100000010000000000000000000'

此函数不起作用
darkshad3 at yahoo dot com
17年前
<?php
Print bindecValues("1023");

function
bindecValues($decimal, $reverse=false, $inverse=false) {
/*
1. 此函数接收一个十进制数,将其转换为二进制,并返回二进制字符串中每个个体二进制值(1)的十进制值。
如果将它们作为字符串传递给函数,则可以使用更大的十进制值!
2. 第二个可选参数反转输出。
3. 第三个可选参数反转二进制字符串,例如 101 变为 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);
}
?>

打印结果为:1, 2, 4, 8, 16, 32, 64, 128, 256, 512
To Top