要添加前导零,我更喜欢以下方法
<?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
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
?>
关于尾随零,在测试了其他人提到的所有选项后,我进行了自己的效率测试,以下是结果
<?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 ));
?>
只是一个例子
如果您将 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”函数。
享受,
氮气。
一个有用的函数,它返回一个带有前导 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>";
?>
<?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
base_convert( base_convert('100001000100000000010001001000
0100100000001111111111111111111',2,10),10,2);
返回
'1000010001000000000100010010000
100100000010000000000000000000'
此函数不起作用
小心用整数进行二进制测试
# 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 位(平台相关)最大无符号整数的一半。
这是我的系统
您可以将十进制数转换为您想要的数制,例如二进制系统。
<?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);
?>
我认为这是最好的函数。几乎是无限的(直到 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);
?>