为了添加前导零,我更喜欢以下方法
<?php
// 添加前导零
$bin = sprintf( "%08d", decbin( 26 )); // "00011010"
?>
(PHP 4, PHP 5, PHP 7, PHP 8)
decbin — 十进制转二进制
num
要转换的十进制值
正数 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) |
正数 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
将带有前导零的二进制格式打印到一个变量中,只需一条简单的语句。
<?php
$binary = sprintf('%08b', $decimal); // $decimal = 5;
echo $binary; // $binary = "00000101";
?>
关于尾随零,在测试了其他人在此处提到的所有选项后,我已经进行了自己的效率测试,以下是结果
<?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 ));
?>
一个快速函数,用于将二进制字符串转换为位序列
<?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
?>
只是一个例子
如果你将26转换为二进制,你会得到11010,这是5个字符长。如果你需要完整的8位值,请使用这个
$bin = decbin(26);
$bin = substr("00000000",0,8 - strlen($bin)) . $bin;
这会将11010转换为00011010。
如果你想要前导零,请使用PHP内置功能而不是自定义函数
<?php
printf('%08b', $decimal);
?>
>> printf('%08b', E_NOTICE)
>> 00001000
大家好,我在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;
}
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 类似的反向操作
?>
另一个大于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;
}
使用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。
一个非常有用的函数,它返回一个带有前导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
在这里,你可以使用标准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>";
?>
base_convert( base_convert('100001000100000000010001001000
0100100000001111111111111111111',2,10),10,2);
返回
'1000010001000000000100010010000
100100000010000000000000000000'
此函数不起作用
<?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