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 作为格式

添加笔记

用户贡献笔记 17 个笔记

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

<?php
$binary
= sprintf('%08b', $decimal); // $decimal = 5;
echo $binary; // $binary = "00000101";
?>
7
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

?>
4
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 ));
?>
6
匿名
18 年前
只是一个例子
如果您将 26 转换为二进制,您将得到 11010,它只有 5 个字符长。如果您需要完整的 8 位值,请使用以下方法

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

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

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

>> printf('%08b', E_NOTICE)
>> 00001000
1
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;
}
1
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

?>
1
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;
}
-1
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”函数。
享受,
氮气。
-1
mcampa at gmail dot com
10 年前
一个有用的函数,它返回一个带有前导 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
-1
ajl at gmx dot de
22 年前
在这里,您可以使用标准 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>";
?>
-2
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
-2
匿名
19 年前
base_convert( base_convert('100001000100000000010001001000
0100100000001111111111111111111',2,10),10,2);

返回
'1000010001000000000100010010000
100100000010000000000000000000'

此函数不起作用
-6
avenger at avenger dot ws
15 年前
小心用整数进行二进制测试

# FFFFFFFF
命令:php -r 'print(decbin(4294967295)."\n");'
结果:11111111111111111111111111111111

# C3E9CAC8
命令:php -r 'print(decbin(3286878920)."\n");'
结果:11000011111010011100101011001000

# 不管指定 "(int)",使用按位与
命令:php -r 'print((int)(3286878920 & 4294967295)."\n");'
结果:-1008088376 (int)

# 现在会得到预期的结果(猜测性能影响)
命令:php -r 'print(bindec(decbin((3286878920 & 4294967295)))."\n");'
结果:3286878920 (浮点数)

附加说明:如果您对一些随机位与相同长度的 1 位序列进行“按位与”运算,则预期结果是相同的“随机位序列”,不会发生改变。如果您想在整数世界中保持此操作以进行更快的比较,则可能会因有符号整数的大小限制而导致结果出错。您想要的结果能使用的最大值是 (7FFFFFFF - 或整数 2147483647),这是 32 位(平台相关)最大无符号整数的一半。
-6
Silas R (15)
11 年前
这是我的系统

您可以将十进制数转换为您想要的数制,例如二进制系统。

<?php

function Dec2oSys($numberDec, $SysNum)
{
if(
$numberDec != 0)
{
$numberOSys = "";
for (;
$numberDec > 0;) {
$numberDecBefore = $numberDec;
$numberDec = $numberDec / $SysNum;
$pos = strpos($numberDec, '.');
if(
$pos != false)
{
$numberDec = floor($numberDec);
$numberOSys .= $numberDecBefore - floor($numberDec) * $SysNum;
$rest = $numberDecBefore - floor($numberDec) * $SysNum;
}
else
{
$numberOSys .= "0";
$rest = 0;

}
print
$numberDec."; Rest:".$rest."<br/>";
}
}
else
{
$numberOSys = "0";
}
return
strrev($numberOSys);
}

print
Dec2oSys(100, 2);

?>
-9
Kay
15 年前
我认为这是最好的函数。几乎是无限的(直到 2^50 或类似的值)

<?php
function bin($int)
{
$i = 0;
$binair = "";
while(
$int >= pow(2,$i))
{
$i++;
}

if(
$i != 0)
{
$i = $i-1; //max i
}

while(
$i >= 0)
{
if(
$int - pow(2,$i) < 0)
{
$binair = "0".$binair;
}else{
$binair = "1".$binair;
$int = $int - pow(2,$i);
}

$i--;
}
return
$binair;
}

$getal = $_GET['getal'];


echo
bin($getal);
?>
To Top